Pakket | flash.external |
Klasse | public final class ExternalInterface |
Overerving | ExternalInterface Object |
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Met de ExternalInterface-klasse kunt u een ActionScript-functie aanroepen in de Flash-runtime, waarbij u JavaScript in de HTML-pagina gebruikt. De ActionScript-functie kan een waarde retourneren en JavaScript ontvangt deze direct als geretourneerde waarde van de aanroep.
Deze functionaliteit vervangt de methode fscommand()
.
Gebruik de klasse ExternalInterface bij de volgende combinaties van browser en besturingssysteem:
Browser | Besturingssysteem | Besturingssysteem |
---|---|---|
Internet Explorer 5.0 en hoger | Windows | |
Netscape 8.0 en hoger | Windows | MacOS |
Mozilla 1.7.5 en hoger | Windows | MacOS |
Firefox 1.0 en hoger | Windows | MacOS |
Safari 1.3 en hoger | MacOS |
Flash Player voor Linux versie 9.0.31.0 en hoger ondersteunt de klasse ExternalInterface in de volgende browsers:
Browser |
---|
Mozilla 1.7.x en hoger |
Firefox 1.5.0.7 en hoger |
SeaMonkey 1.0.5 en hoger |
De klasse ExternalInterface gebruikt de webbrowser van de gebruiker om ActiveX® of de NPRuntime-API te ondersteunen die door sommige browsers wordt gebruikt voor scriptbewerkingen voor insteekmodules. Ook als een combinatie van een browser en besturingssysteem hierboven niet wordt vermeld, ondersteunen deze de klasse ExternalInterface als ze de NPRuntime-API ondersteunen. Raadpleeg http://www.mozilla.org/projects/plugins/npruntime.html.
Opmerking: als u SWF-bestanden insluit in een HTML-pagina, moet u ervoor zorgen dat het kenmerk id
is ingesteld en dat de kenmerken id
en name
van de tags object
en embed
de volgende tekens niet bevatten:
. - + * / \
Opmerking voor Flash Player-toepassingen: Flash Player versie 9.0.115.0 en hoger biedt ondersteuning voor .
(punt) worden gebruikt binnen de kenmerken id
en name
.
Opmerking voor Flash Player-toepassingen: als u Flash Player 10 of hoger uitvoert in een browser en deze klasse via de programmacode gebruikt om een pop-upvenster te openen, lukt dit mogelijk niet. Verschillende browsers (en browserconfiguraties) blokkeren pop-upvensters namelijk vaak en er kan dus niet worden gegarandeerd dat het venster daadwerkelijk wordt weergegeven. De meeste kans op succes hebt u als u deze klasse alleen gebruikt om een pop-upvenster te openen in code die wordt uitgevoerd als een direct resultaat van een gebruikersactie (zoals in een gebeurtenishandler voor een muisklik of het indrukken van een toets.)
Vanuit ActionScript hebt u op de HTML-pagina de volgende mogelijkheden:
- U kunt een JavaScript-functie aanroepen.
- U kunt elk aantal argumenten doorgeven.
- U kunt verschillende gegevenstypen doorgeven (zoals Boolean, Number, String, enzovoort).
- U kunt een geretourneerde waarde ontvangen van de JavaScript-functie.
Vanuit JavaScript kunt u op de HTML-pagina:
- Een ActionScript-functie aanroepen.
- Argumenten doorgeven met een notatie voor standaardfunctieaanroep.
- Een waarde naar de JavaScript-functie retourneren.
Opmerking voor Flash Player-toepassingen: Flash Player biedt momenteel geen ondersteuning voor SWF-bestanden die zijn ingesloten in HTML-formulieren.
Opmerking voor AIR-toepassingen: in Adobe AIR kunt u met de ExternalInterface-klasse communiceren tussen JavaScript in een HTML-pagina dat is geladen in het HTMLLoader-besturingselement en ActionScript in SWF-inhoud dat is ingesloten in de desbetreffende HTML-pagina.
Meer voorbeelden
Accessing Flex from JavaScript
About ExternalInterface API security in Flex
Verwante API-elementen
Eigenschap | Gedefinieerd door | ||
---|---|---|---|
available : Boolean [statisch] [alleen-lezen]
Hiermee wordt aangegeven of deze speler zich in een container bevindt die een externe interface biedt. | ExternalInterface | ||
constructor : Object
Verwijzing naar het klasseobject of de constructorfunctie van een bepaalde objectinstantie. | Object | ||
marshallExceptions : Boolean = false [statisch]
Geeft aan of de externe interface moet proberen ActionScript-uitzonderingen door te geven aan de huidige browser en JavaScript-uitzonderingen aan de speler. | ExternalInterface | ||
objectID : String [statisch] [alleen-lezen]
Hiermee wordt het kenmerk id van de tag object in Internet Explorer of het kenmerk name van de tag embed in Netscape geretourneerd. | ExternalInterface |
Methode | Gedefinieerd door | ||
---|---|---|---|
[statisch]
Hiermee wordt een ActionScript-methode geregistreerd als aanroepbaar vanuit de container. | ExternalInterface | ||
[statisch]
Roept een functie aan die door de SWF-container beschikbaar wordt gemaakt, waarbij nul of meer argumenten worden doorgegeven. | ExternalInterface | ||
Geeft aan of voor een object een opgegeven eigenschap is gedefinieerd. | Object | ||
Geeft aan of een instantie van de klasse Object zich in de prototypeketen van het object bevindt dat als parameter is opgegeven. | Object | ||
Geeft aan of de opgegeven eigenschap bestaat en kan worden opgesomd. | Object | ||
Stelt de beschikbaarheid van een dynamische eigenschap voor lusbewerkingen in. | Object | ||
Geeft de tekenreeksweergave van dit object weer, geformatteerd volgens de locatiespecifieke conventies. | Object | ||
Retourneert een tekenreeksrepresentatie van het opgegeven object. | Object | ||
Retourneert de primitieve waarde van het opgegeven object. | Object |
available | eigenschap |
available:Boolean
[alleen-lezen] Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Hiermee wordt aangegeven of deze speler zich in een container bevindt die een externe interface biedt. Als de externe interface beschikbaar is, is deze eigenschap true
; anders is deze false
.
Opmerking: wanneer u de externe API met HTML gebruikt, moet u altijd controleren of de HTML volledig is geladen voordat u een JavaScript-methode aanroept.
Implementatie
public static function get available():Boolean
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
available
gebruikt om te bepalen of de speler zich in een container bevindt met een externe interface.
package { import flash.text.TextField; import flash.display.MovieClip; import flash.external.ExternalInterface; public class extint_test extends MovieClip { public function extint_test() { var isAvailable:Boolean = ExternalInterface.available; var availTxt:TextField = new TextField(); availTxt.text = isAvailable.toString(); addChild(availTxt); } } }
marshallExceptions | eigenschap |
public static var marshallExceptions:Boolean = false
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 1.0, Flash Player 9.0.115.0, Flash Lite 4 |
Geeft aan of de externe interface moet proberen ActionScript-uitzonderingen door te geven aan de huidige browser en JavaScript-uitzonderingen aan de speler. U moet deze eigenschap expliciet instellen op true
om JavaScript-uitzonderingen in ActionScript en ActionScript-uitzonderingen in JavaScript af te vangen.
Verwante API-elementen
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
addCallback()
. De nieuwe functie genereert een uitzondering, zodat deze kan worden afgevangen door JavaScript-code die wordt uitgevoerd in de browser. Dit voorbeeld bevat ook een instructie try..catch
om uitzonderingen af te vangen die door de browser worden gegenereerd wanneer de functie throwit()
wordt aangeroepen.
package { import flash.external.* import flash.net.*; import flash.display.*; import flash.system.System; public class ext_test extends Sprite { function ext_test():void { ExternalInterface.marshallExceptions = true; ExternalInterface.addCallback("g", g); try { ExternalInterface.call("throwit"); } catch(e:Error) { trace(e) } } function g() { throw new Error("exception from actionscript!!!!") } } }
objectID | eigenschap |
objectID:String
[alleen-lezen] Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Hiermee wordt het kenmerk id
van de tag object
in Internet Explorer of het kenmerk name
van de tag embed
in Netscape geretourneerd.
Implementatie
public static function get objectID():String
addCallback | () | methode |
public static function addCallback(functionName:String, closure:Function):void
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Hiermee wordt een ActionScript-methode geregistreerd als aanroepbaar vanuit de container. Na aanroep van addCallBack()
kan de geregistreerde functie in de speler door JavaScript- of ActiveX-code in de container worden aangeroepen.
Opmerking: voor het lokaal uitvoeren van inhoud in een browser, werken aanroepen van de methode ExternalInterface.addCallback()
alleen wanneer het SWF-bestand en de bijbehorende webpagina zich in de beveiligingssandbox Lokaal-vertrouwd bevinden. Lees voor meer informatie het onderwerp Security in het Flash Player Developer Center.
Parameters
functionName:String — De naam waarmee de container de functie kan aanroepen.
| |
closure:Function — De functie closure die moet worden aangeroepen. Dit kan een zelfstandige functie zijn of een methode closure die verwijst naar een methode van een objectinstantie. Door een methode closure door te geven, kunt u de callback naar een methode van een specifieke objectinstantie sturen.
Opmerking: als u |
Gegenereerde uitzondering
Error — De container ondersteunt geen binnenkomende aanroepen. Binnenkomende aanroepen worden alleen ondersteund door Internet Explorer voor Windows en browsers die de API NPRuntime gebruiken, zoals Mozilla 1.7.5 en hoger of Firefox 1.0 en hoger.
| |
SecurityError — Er is al een opgegeven naam aan een sandbox toegevoegd door ActionScript, waartoe u geen toegang hebt. U kunt de callback niet overschrijven. U kunt dit omzeilen door de ActionScript die oorspronkelijk de methode addCallback() aanriep, te herschrijven zodat deze ook de methode Security.allowDomain() aanroept.
| |
SecurityError — De omgeving ervan behoort tot een beveiligingssandbox waartoe de aanroepende code geen toegang heeft. U kunt deze fout op de volgende manier oplossen:
|
Verwante API-elementen
call | () | methode |
public static function call(functionName:String, ... arguments):*
Taalversie: | ActionScript 3.0 |
Runtimeversies: | AIR 1.0, Flash Player 9, Flash Lite 4 |
Roept een functie aan die door de SWF-container beschikbaar wordt gemaakt, waarbij nul of meer argumenten worden doorgegeven. Wanneer de functie niet beschikbaar is, retourneert de aanroep null
; anders wordt de waarde geretourneerd die door de functie wordt gegeven. Herhaling is niet toegestaan voor Opera- of Netscape-browsers; in deze browsers levert een recursieve aanroep een reactie null
op. (Herhaling wordt wel ondersteund door Internet Explorer- en Firefox-browsers.)
Wanneer de container een HTML-pagina is, roept deze methode een JavaScript-functie in een script
-element aan.
Wanneer de container een andere ActiveX-container is, verzendt deze methode een gebeurtenis FlashCall ActiveX met de opgegeven naam en verwerkt de container de gebeurtenis.
Wanneer de container als host fungeert voor de Netscape-insteekmodule, kunt u aangepaste ondersteuning voor de nieuwe NPRuntime-interface schrijven of een HTML-besturingselement insluiten en de speler in het HTML-besturingselement insluiten. Wanneer u een HTML-besturingselement insluit, kunt u communiceren met de speler via een JavaScript-interface naar de native containertoepassing.
Opmerking: voor het lokaal uitvoeren van inhoud in een browser, worden aanroepen van de methode ExternalInterface.call()
alleen toegestaan wanneer het SWF-bestand en de bijbehorende webpagina zich in de beveiligingssandbox Lokaal-vertrouwd bevinden. U kunt bovendien voorkomen dat een SWF-bestand deze methode gebruikt door de parameter allowNetworking
in te stellen van de tags object
en embed
op de HTML-pagina die de SWF-inhoud bevat. Lees voor meer informatie het onderwerp Security in het Flash Player Developer Center.
Opmerking voor Flash Player-toepassingen: in Flash Player 10 en Flash Player 9 Update 5 is deze methode in sommige webbrowsers niet mogelijk als een pop-upblokkering is ingeschakeld. In dit scenario kunt u deze methode alleen aanroepen in reactie op een gebruikersgebeurtenis (bijvoorbeeld in een gebeurtenishandler voor een muisklik of een toetsaanslag).
Parameters
functionName:String — De alfanumerieke naam van de functie die in de container wordt aangeroepen. Als u een niet-alfanumerieke functienaam gebruikt, treedt er een runtime-fout op (fout 2155). U kunt een blok try..catch gebruiken om de fout af te handelen.
| |
... arguments — De argumenten die aan de functie worden doorgegeven in de container. U kunt nul of meer parameters opgeven, gescheiden door komma's. Deze parameters kunnen van elk ActionScript-gegevenstype zijn. Wanneer de aanroep op een JavaScript-functie is gericht, worden de ActionScript-gegevenstypen automatisch omgezet in JavaScript-gegevenstypen; wanneer een aanroep op een andere ActiveX-container is gericht, worden de parameters in de aanvraag gecodeerd.
|
* — De reactie die van de container wordt ontvangen. Wanneer de aanroep is mislukt (bijvoorbeeld omdat een dergelijke functie niet aanwezig is in de container, de interface niet beschikbaar is, een herhaling is opgetreden (met een Netscape- of Opera-browser) of er een beveiligingsprobleem is), wordt null geretourneerd en een fout gegenereerd.
|
Gegenereerde uitzondering
Error — De container ondersteunt geen uitgaande aanroepen. Uitgaande aanroepen worden alleen ondersteund door Internet Explorer voor Windows en browsers die de API NPRuntime gebruiken, zoals Mozilla 1.7.5 en hoger of Firefox 1.0 en hoger.
| |
SecurityError — De omgeving ervan behoort tot een beveiligingssandbox waartoe de aanroepende code geen toegang heeft. U kunt deze fout op de volgende manier oplossen:
|
Voorbeeld ( Hoe dit voorbeeld te gebruiken )
// // Requires: // - A Flash Professional Label component on the Stage with an instance name of "lbl". // - A Flash Professional Button component on the Stage with an instance name of "button". // var xmlResponse:String = "<invoke name=\"isReady\" returntype=\"xml\"><arguments><number>1</number><number>" + stage.stageWidth + "</number><number>" + stage.stageHeight + "</number></arguments></invoke>"; lbl.text = "ExternalInterface.available: " + ExternalInterface.available; lbl.width = 200; button.enabled = ExternalInterface.available; button.addEventListener(MouseEvent.CLICK, button_click); function button_click(evt:MouseEvent):void { ExternalInterface.call("alert", xmlResponse); }
package { import flash.display.Sprite; import flash.events.*; import flash.external.ExternalInterface; import flash.text.TextField; import flash.utils.Timer; import flash.text.TextFieldType; import flash.text.TextFieldAutoSize; import flash.system.Security; public class ExternalInterfaceExample extends Sprite { private var input:TextField; private var output:TextField; private var sendBtn:Sprite; public function ExternalInterfaceExample() { // constructor code Security.allowDomain("*"); input = new TextField(); input.type = TextFieldType.INPUT; input.background = true; input.border = true; input.width = 350; input.height = 18; addChild(input); sendBtn = new Sprite(); sendBtn.mouseEnabled = true; sendBtn.x = input.width + 10; sendBtn.graphics.beginFill(0xcccccc); sendBtn.graphics.drawRoundRect(0, 0, 80, 18, 10, 10); sendBtn.graphics.endFill(); sendBtn.addEventListener(MouseEvent.CLICK, clickHandler); addChild(sendBtn); output = new TextField(); output.y = 25; output.width = 450; output.height = 325; output.multiline = true; output.wordWrap = true; output.border = true; output.text = "Initializing...\n"; addChild(output); if (ExternalInterface.available) { try { output.appendText("Adding callback...\n"); ExternalInterface.addCallback("sendToActionScript", receivedFromJavaScript); if (checkJavaScriptReady()) { output.appendText("JavaScript is ready.\n"); } else { output.appendText("JavaScript is not ready, creating timer.\n"); var readyTimer:Timer = new Timer(100, 0); readyTimer.addEventListener(TimerEvent.TIMER, timerHandler); readyTimer.start(); } } catch (error:SecurityError) { output.appendText("A SecurityError occurred: " + error.message + "\n"); } catch (error:Error) { output.appendText("An Error occurred: " + error.message + "\n"); } } else { output.appendText("External interface is not available for this container."); } } private function receivedFromJavaScript(value:String):void { output.appendText("JavaScript says: " + value + "\n"); } private function checkJavaScriptReady():Boolean { var isReady:Boolean = ExternalInterface.call("isReady"); return isReady; } private function timerHandler(event:TimerEvent):void { output.appendText("Checking JavaScript status...\n"); var isReady:Boolean = checkJavaScriptReady(); if (isReady) { output.appendText("JavaScript is ready.\n"); output.appendText("ExternalInterface.objectID = " + ExternalInterface.objectID + "\n"); Timer(event.target).stop(); } } private function clickHandler(event:MouseEvent):void { if (ExternalInterface.available) { ExternalInterface.call("sendToJavaScript", input.text); } } } }
<!-- saved from url=(0014)about:internet --> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>ExternalInterfaceExample</title> <script language="JavaScript"> var jsReady = false; function isReady() { return jsReady; } function pageInit() { jsReady = true; document.forms["form1"].output.value += "\n" + "JavaScript is ready.\n"; } function sendToActionScript(value) { document.getElementById("ExternalInterfaceExample").sendToActionScript(value); } function sendToJavaScript(value) { document.forms["form1"].output.value += "ActionScript says: " + value + "\n"; } </script> </head> <body onload="pageInit();"> <object id="ExternalInterfaceExample" name="ExternalInterfaceExample" type="application/x-shockwave-flash" data="ExternalInterfaceExample.swf" width="550" height="400"> <param name="movie" value="ExternalInterfaceExample.swf"/> <param name="quality" value="high"/> <param name="allowscriptaccess" value="always"/> <a href="http://www.adobe.com/go/getflash"> <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player"/> </a> </object> <form name="form1" onsubmit="return false;"> <input type="text" name="input" value="" /> <input type="button" value="Send" onclick="sendToActionScript(this.form.input.value);" /><br /> <textarea cols="60" rows="20" name="output" readonly="true">Initializing...</textarea> </form> </body> </html>
Wed Jun 13 2018, 11:42 AM Z