<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zeroseven labs &#187; ExternalInterface</title>
	<atom:link href="http://labs.zeroseven.de/tag/externalinterface/feed/" rel="self" type="application/rss+xml" />
	<link>http://labs.zeroseven.de</link>
	<description></description>
	<lastBuildDate>Wed, 28 Jul 2010 07:43:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>HTML in Flex Applikationen einbinden</title>
		<link>http://labs.zeroseven.de/development/flex/html-in-flex-applikationen-einbinden/</link>
		<comments>http://labs.zeroseven.de/development/flex/html-in-flex-applikationen-einbinden/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 08:25:42 +0000</pubDate>
		<dc:creator>juergenm</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[ExternalInterface]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=380</guid>
		<description><![CDATA[Mithilfen der HTMLLoader Komponente kann man in Adobe AIR komplette HTML Seiten laden und anzeigen. So kann man einfach seinen eigenen Webrowser bauen. Die HTMLLoader Klasse gibt es aber leider nur für AIR und nicht in Flex, da eine Flex Applikation ja normalerweise in einem Webbrowser läuft. Doch es gibt eine Möglichkeit HTML Inhalt innerhalb [...]]]></description>
			<content:encoded><![CDATA[<p>Mithilfen der HTMLLoader Komponente kann man in Adobe AIR komplette HTML Seiten laden und anzeigen. So kann man einfach seinen eigenen Webrowser bauen. Die HTMLLoader Klasse gibt es aber leider nur für AIR und nicht in Flex, da eine Flex Applikation ja normalerweise in einem Webbrowser läuft. Doch es gibt eine Möglichkeit HTML Inhalt innerhalb einer Flex Applikation darzustellen. Das HTML Dokument das die Flex Applikation einbindet enthält einen IFrame der die HTML Seite lädt. Nun wird der IFrame über die Flex Applikation gelegt und per JavaScript positioniert. So entsteht der Eindruck die Flex Applikation enthält eine HTML Seite.</p>
<p><span id="more-380"></span></p>
<p><strong>HTML Dokument vorbereiten</strong></p>
<p>Das HTML Dokument in dem die Flex Applikation eingebunden wird muss einen absolut positionierten div Container enthalten in dem ein IFrame erzeugt wird der wiederum die HTML Seite anzeigt:</p>
<pre>&lt;div id="myFrame"
style="position:absolute; background-color:transparent; border:0px;
visibility:hidden;"&gt;&lt;/div&gt;</pre>
<p>Wichtig ist, dass dieser div Container ganz am Ende des HTML Dokuments steht um den Container über die Flex Applikation legen zu können.</p>
<p>Über die JavaScript Funktion loadIFrame wird innerhalb des div Containers ein IFrame erstellt und die von Flex übergebene url wird aufgerufen.</p>
<pre>function loadIFrame(url){
	document.getElementById("myFrame").innerHTML =
	"&lt;iframe id='myIFrame' src='" + url + "'frameborder='0'&gt;&lt;/iframe&gt;";
}
</pre>
<p>Danch wird von Flex aus die JavaScript Function moveIFrame aufgerufen um die Größe und die Position des IFrames einzustellen.</p>
<pre>function moveIFrame(x,y,w,h) {
    var frameRef=document.getElementById("myFrame");
    frameRef.style.left=x;
    frameRef.style.top=y;
    var iFrameRef=document.getElementById("myIFrame");
	iFrameRef.width=w;
	iFrameRef.height=h;
}
</pre>
<p>Nun kann von Flex aus die Sichtbarkeit des IFrames über die beiden Funktionen showIFrame und hideIFrame gesteuert werden.</p>
<pre>function showIFrame(){
    document.getElementById("myFrame").style.visibility="visible";
}

function hideIFrame(){
    document.getElementById("myFrame").style.visibility="hidden";
}
</pre>
<p>Damit ist das HTML Dokument fertig, jetzt müssen wir die IFrame Klasse in Flex einbinden.</p>
<p><strong>IFrame in Flex Applikation einfügen:</strong></p>
<p>Um die HTML Seite einbetten zu können wird die IFrame Klasse benötigt. Diese ruft über <a href="http://labs.zeroseven.de/2008/08/flash-externalinterface/">ExternalItnerface.call()</a> die JavaScript Funktionen in unserem HTML Dokument auf.</p>
<pre>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
    resize="callLater(moveIFrame)"
    move="callLater(moveIFrame)"&gt;
    &lt;mx:Script&gt;
    &lt;![CDATA[
        import flash.external.ExternalInterface;
        import flash.geom.Point;
        import flash.net.navigateToURL;

        private var __source: String;

        /**
         * Move iframe through ExternalInterface.
         * The location is determined using localToGlobal()
         * on a Point in the Canvas.
         **/
        private function moveIFrame(): void {
            var localPt:Point = new Point(0, 0);
            var globalPt:Point = this.localToGlobal(localPt);
            ExternalInterface.call("moveIFrame", globalPt.x, globalPt.y,
                        this.width, this.height);
        }

        /**
         * The source URL for the IFrame.
         * When set, the URL is loaded through ExternalInterface.
         **/
        public function set source(source: String): void {
            if (source) {
				trace(source);
                if (! ExternalInterface.available) {
                    throw new Error("ExternalInterface is not available in
                    this container. Internet Explorer ActiveX, Firefox,
                    Mozilla 1.7.5 and greater, or other browsers that
                    support NPRuntime are required.");
                }
                __source = source;
                ExternalInterface.call("loadIFrame", source);
                moveIFrame();
            }
        }

        public function get source(): String {
            return __source;
        }

        /**
         * Whether the IFrame is visible.
         **/
        override public function set visible(visible: Boolean): void {
            super.visible=visible;
            if (visible) {
                ExternalInterface.call("showIFrame");
            } else {
                ExternalInterface.call("hideIFrame");
            }
        }

    ]]&gt;
    &lt;/mx:Script&gt;
&lt;/mx:Canvas&gt;
</pre>
<p>Wird nun über IFrame.source eine URL festgelegt wird der IFrame im HTML Dokument erzeugt und die Seite mit der angegebenen URL geladen. Dann wird sofort die Funktion moveIFrame() aufgerufen, die den HTML-IFrame anhand der größe des Flex-IFrames skaliert und positioniert. Wenn jetzt der IFrame auf visible = true gesetzt wird, wird dieser sichtbar und man hat den Eindruck der HTML Content sei direkt in der Flex Applikation eingebettet.</p>
<p><strong>Probleme dieser Lösung</strong></p>
<p>Schon in den ersten Tests ergaben sich folgende Probleme dieser Lösung mit dem IFrame:</p>
<ul>
<li>Da der IFrame über der Flex Applikation liegt werden eventuelle PopUps überlagert.<br />
Lösung:</p>
<ul>
<li>Wenn ein PopUp von Flex generiert wird muss der IFrame auf visible = false gesetzt werden.</li>
<li>- Das PopUp muss so positioniert werden, dass es vom IFrame nicht überlagert wird.</li>
</ul>
</li>
<li>Framesets werden nicht fehlerfrei dargestellt.</li>
<li></li>
<li>Drag&amp;Drop Ereignisse über dem IFrame werden von Flex nicht mehr erkannat.</li>
</ul>
<p>Aufgrund der oben angesprochenen Probleme ist die IFrame Lösung für größere Anwendungen wohl nicht die optimale Option. Dennnoch finde ich den Ansatz interessant und für nicht sehr aufwändige Applikationen auf jeden Fall empfehlenswert.</p>
<p><strong>Links</strong><br />
<a href="http://www.deitte.com/IFrameDemo3/IFrameDemo.html">http://www.deitte.com/IFrameDemo3/IFrameDemo.html</a><br />
<a href="http://www.judahfrangipane.com/blog/?p=137">http://www.judahfrangipane.com/blog/?p=137</a></p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/flex/html-in-flex-applikationen-einbinden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash: ExternalInterface</title>
		<link>http://labs.zeroseven.de/design/flash-externalinterface/</link>
		<comments>http://labs.zeroseven.de/design/flash-externalinterface/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 07:59:44 +0000</pubDate>
		<dc:creator>alexanders</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[DESIGN]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[ExternalInterface]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=388</guid>
		<description><![CDATA[ExternalInterface bietet dem Entwickler von Flash eine Schnittstelle zwischen ActionScript und dem Container der den Flash-Player enthält. Im besonderen können hiermit JavaScript-Funktionen in HTML-Seiten aufgerufen werden.

ExternlInterface bietet nicht nur einen Aufruf von Funktionen außerhalb von Flash, sondern hiermit können auch Rückgabewerte zurück an Flash geliefert werden. Auch der Weg vom Flash-Player-Container zu ActionScript ist möglich. [...]]]></description>
			<content:encoded><![CDATA[<p>ExternalInterface bietet dem Entwickler von Flash eine Schnittstelle zwischen ActionScript und dem Container der den Flash-Player enthält. Im besonderen können hiermit JavaScript-Funktionen in HTML-Seiten aufgerufen werden.</p>
<p><span id="more-388"></span></p>
<p>ExternlInterface bietet nicht nur einen Aufruf von Funktionen außerhalb von Flash, sondern hiermit können auch Rückgabewerte zurück an Flash geliefert werden. Auch der Weg vom Flash-Player-Container zu ActionScript ist möglich. Das heißt, bestimmte Funktionen können in ActionScript zum Beispiel mittels JavaScript aufgerufen wegen mit Parameter-Übergabe. Die zwei hierfür verwendeten Methoden sind die addCallback- und call-Methoden. Die addCallBack-Methode ermöglicht den Aufruf von AS-Funktionen von außen, call den Weg anders herum.</p>
<p>Die Parameter von ExternalInterface.addCallBack sind erstens der Name mit dem die Funktion von außen aufgerufen werden kann, zweitens das Objekt auf das sich die Methode bezieht und drittens die Methode die zur weiteren Verarbeitung aufgerufen wird. Die Verknüpfung erfolgt wie das Beispiel von Adobe zeigt:<br />
<code><br />
&lt;script&gt;<br />
function callExternalInterface() {<br />
thisMovie("externalInterfaceExample").goHome();<br />
}<br />
function thisMovie(movieName) {<br />
if (navigator.appName.indexOf("Microsoft") != -1) {<br />
return window[movieName]<br />
}<br />
else {<br />
return document[movieName]<br />
}<br />
}<br />
&lt;/script&gt;<br />
</code></p>
<p>Hier müssen das id-Attribut (Object-Tag) und das name-Attribut (Embed-Tag) den Wert  &#8221;externalInterfaceExample&#8221; haben.</p>
<p>Mit ExternalInterface.call können wie gesagt Funktionen aufgerufen werden. Call hat zwei Parameter. Zum Einen dem Funktionsnamen und zum Anderen einen optionalen Parameter.  Auch kann mit der call-Methode  ein Rückgabewert abgefangen und weiterverarbeitet werden.</p>
<p>Diese beiden Methoden bieten ein die Möglichkeit einer einfachen Implementierung einer Schnittstelle in Flash, die sich vorwiegend für die Kommunikation mit JavaScript, aber auch anderen Sprachen wie C, anbietet.  Die Anwendungsgebiete hierfür sind sehr zahlreich und reichen vom einfachen Auslesen der Browserinnengröße bis zur Verwendung einer Flash-Navigation in Web 2.0 Seiten.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/design/flash-externalinterface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
