flash.externalExtensionContext Класс ExtensionContext предоставляет интерфейс для вызова функций в собственной реализации расширения ActionScript.flash.events:EventDispatcher Класс ExtensionContext предоставляет интерфейс для вызова функций в собственной реализации расширения ActionScript. Этот класс можно использовать только в классах ActionScript, которые входят в состав расширения.

Поддержка в профилях AIR: эта функция поддерживается только в среде AIR для телевизионных устройств в программах, в которых применяется профиль устройств extendedTV.

Расширение ActionScript представляет собой комбинацию следующих компонентов:

  • Классы ActionScript.
  • Собственный код. Собственный код — это код, который выполняется на устройстве вне среды выполнения. Например, код, который написан на языке C, является собственным кодом.

Можно создать расширение ActionScript для открытия в программе AIR доступа к определенным функциям устройства. В числе других причин создания расширения ActionScript — повторное использование существующего собственного кода или обеспечение более эффективной обработки с использованием собственного кода, предоставляемого с помощью кода ActionScript. Для получения дополнительной информации о написании, сборке и упаковке расширений ActionScript см. PDF-документ «Разработка расширений ActionScript для Adobe AIR».

Используйте класс ExtensionContext на стороне ActionScript расширения ActionScript для доступа к собственной части расширения. Сначала создайте экземпляр класса ExtensionContext. Для этого вызовите статический метод ExtensionContext.createExtensionContext().

После создания экземпляра ExtensionContext используйте метод call() экземпляра для вызова собственной функции.

По завершении работы с экземпляром ExtensionContext вызовите метод dispose() для освобождения любых связанных собственных ресурсов. Без явного вызова метода dispose() «сборщик мусора» среды выполнения вызывает метод dispose() при удалении экземпляра. Явный вызов метода dispose(), как правило, происходит гораздо быстрее запуска функции «сборщик мусора».

Экземпляр ExtensionContext может прослушивать события StatusEvent, которые отправляет собственный код в случае возникновения некоторых асинхронных событий в собственной реализации расширения. Так как класс ExtensionContext является производным от класса EventDispatcher, он может в свою очередь отправлять события.

Класс ExtensionContext также обеспечивает статический метод getExtensionDirectory() для доступа к каталогу, в котором расширение установлено на устройстве. Он также обеспечивает свойство actionScriptData для общего доступа к данным вместе с собственной реализацией расширения.

Примечание. В программах AIR, в которых используется профиль extendedDesktop, можно использовать класс NativeProcess для выполнения собственных процессов.

Разработка расширений ActionScript для Adobe AIRflash.desktop.NativeProcesscall Вызывает собственную функцию, указанную в functionName.Отсутствует функция, имя которой совпадает с именем, указанным в functionName. ArgumentErrorArgumentErrorМетод dispose() уже вызван в этом экземпляре ExtensionContext. Эта ошибка также создается, если собственная функция возвращает недопустимую ссылку на объект. IllegalOperationErrorflash.errors:IllegalOperationErrorЗначение, возвращенное собственной функцией. Значение null возвращается, если собственная функция не возвращает значение или возвращает недопустимую ссылку на объект. ObjectfunctionNameStringИмя, которое представляет функцию в собственной реализации. Это имя может не совпадать с фактическим именем собственной функции и являться любым именем, согласованным в части ActionScript и собственной части расширения. argsСписок аргументов для собственной функции. Эти аргументы могут быть любыми объектами ActionScript: примитивные типы или объекты класса ActionScript. Типы и прядок аргументов согласованы в части ActionScript и собственной части расширения. Вызывает собственную функцию, указанную в functionName. Любые дополнительные аргументы передаются в собственную функцию. createExtensionContext Создает экземпляр ExtensionContext для указанных идентификатора расширения и типа контекста.Параметр extensionID имеет значение null и не является допустимым идентификатором расширения. ArgumentErrorArgumentErrorНовый экземпляр ExtensionContext. Возвращает значение null, если расширение с указанным значением extensionID недоступно. flash.external:ExtensionContextextensionIDStringИдентификатор расширения. Значение этого идентификатора совпадает со значением элемента id в файле дескриптора расширения. Разработчики программ также используют это значение в элементе extensionID файла дескриптора программы. Все расширения совместно используют одно глобальное пространство имен. Поэтому во избежание конфликтов имен используйте обратную запись DNS для идентификатора расширения. contextTypeStringТип контекста расширения. В зависимости от типа контекста выполнение инициализации в собственной реализации может различаться. Это различие может заключаться в том, что в собственной реализации указывается другой набор собственных функций, доступных для вызова на стороне ActionScript. Значением типа контекста является любая строка, согласованная между частями ActionScript и собственной частью расширения. В простых расширениях зачастую не используются другие типы контекстов. В этих случаях передайте пустую строку "" или null в качестве значения contextType. Создает экземпляр ExtensionContext для указанных идентификатора расширения и типа контекста. dispose Избавляется от этого экземпляра ExtensionContext. Избавляется от этого экземпляра ExtensionContext.

Среда выполнения уведомляет собственную реализацию, которая может освободить любые связанные собственные ресурсы. После вызова dispose() код не может вызывать метод call() и получать или устанавливать значение свойства actionScriptData.

getExtensionDirectory Возвращает каталог, в котором расширение установлено на устройстве.Каталог не существует. Наиболее вероятная причина — указанное значение extensionID недействительно. IOErrorflash.errors:IOErrorЭкземпляр File для каталога, в котором установлено расширение. flash.filesystem:FileextensionIDStringИдентификатор расширения. Значение этого идентификатора совпадает со значением параметра extensionID в createExtensionContext(). Возвращает каталог, в котором расширение установлено на устройстве.

Иногда расширение включает ресурсы, такие как изображения, к которым необходимо получать доступ из кода ActionScript расширения. Иногда код также запрашивает информацию, которая доступна в файле дескриптора расширения, например сведения о номере версии расширения. Этот метод можно использовать для доступа к основному каталогу расширения.

Независимо от папки, в которой расширение установлено на устройстве, файлы расширения всегда находятся в одном и том же месте относительно этого основного каталога расширения. С использованием экземпляра File, возвращенного этим методом, можно перейти к определенным файлам, входящим в состав расширения, и управлять ими.

actionScriptData Объект ActionScript (если таковой имеется), связанный с данным контекстом.ObjectМетод dispose() уже вызван в этом экземпляре ExtensionContext. IllegalOperationErrorflash.errors:IllegalOperationError Объект ActionScript (если таковой имеется), связанный с данным контекстом.

Можно связать любой объект ActionScript с экземпляром ExtensionContext. В собственной реализации можно также получать и задавать этот объект ActionScript. Поэтому можно использовать метод actionScriptData для совместного использования данных на стороне ActionScript и собственной стороне расширения.

Можно также установить значение actionScriptData, равное null.

ExternalInterface Класс ExternalInterface представляет собой интерфейс прикладного программирования (API), который обеспечивает прямую связь между ActionScript и контейнером SWF, таким как страница HTML с JavaScript или компьютерная программа, использующая Flash Player для отображения SWF-файла.Создает связь между объектом ActionScript и контейнером. Object Класс ExternalInterface представляет собой интерфейс прикладного программирования (API), который обеспечивает прямую связь между ActionScript и контейнером SWF, таким как страница HTML с JavaScript или компьютерная программа, использующая Flash Player для отображения SWF-файла.

С помощью класса ExternalInterface можно вызвать функцию ActionScript в среде выполнения Flash, использующей JavaScript на странице HTML. Функция ActionScript может возвратить значение, которое JavaScript немедленно получит в качестве возвращаемого значения вызова.

Поддержка данной возможности заменяет метод fscommand().

Используйте класс ExternalInterface при работе со следующими комбинациями браузеров и операционных систем:

БраузерОперационная системаОперационная системаInternet Explorer версии 5.0 или новееWindows Netscape версии 8.0 или новееWindowsMacOSMozilla 1.7.5 или новееWindowsMacOSFirefox версии 1.0 или новееWindowsMacOSSafari версии 1.3 или новее MacOS

Flash Player для Linux версии 9.0.31.0 и более новые версии программы обладают поддержкой класса ExternalInterface в следующих браузерах:

БраузерMozilla версии 1.7.x или новееFirefox версии 1.5.0.7 или новееSeaMonkey версии 1.0.5 или новее

Класс ExternalInterface требует от web-браузера пользователя поддержки ActiveX® или NPRuntime API, используемых им для выполнения сценариев с использованием подключаемых модулей. Если в списке отсутствует комбинация браузер/операционная система, при наличии поддержки NPRuntime API класс ExternalInterface должен также поддерживаться. См. http://www.mozilla.org/projects/plugins/npruntime.html.

Примечание. При внедрении SWF-файлов в страницу HTML убедитесь в том, что атрибут id задан и что атрибуты id и name тегов object и embed не содержат следующих символов:

 . - + ~~ / \
 

Примечание для программ Flash Player. Flash Player версии 9.0.115.0 и более поздних позволяет использовать . (точка) в атрибутах id и name.

Примечание для программ Flash Player. В проигрывателе Flash Player 10 и более поздних версий, запущенном в браузере, при использовании этого класса в программных средствах открытие всплывающего окна может не выполняться. Различные браузеры (и конфигурации браузеров) могут блокировать всплывающие окна в любое время; невозможно гарантировать, что какое-либо всплывающее окно будет отображаться. Однако для повышения вероятности открытия всплывающего окна используйте этот класс только в коде, который выполняется в качестве непосредственного результата действия пользователя (например, в обработчике событий для события щелчка мышью или нажатия клавиши).

Используя ActionScript на странице HTML, можно сделать следующее:

  • Вызвать любую функцию на языке JavaScript.
  • Передать любое число аргументов с любыми именами.
  • Передать любой тип данных (логический, числовой, строковый и так далее).
  • Получить возвращаемое функцией JavaScript значение.

Используя JavaScript на странице HTML, можно сделать следующее:

  • Вызвать любую функцию на языке ActionScript.
  • Передать аргументы с использованием стандартной функции нотации.
  • Возвратить значение в функцию JavaScript.

Примечание для программ Flash Player. Flash Player в настоящее время не поддерживает SWF-файлы, встроенные в формы HTML.

Примечание для программ AIR. В Adobe AIR класс ExternalInterface может использоваться для обеспечения взаимодействия сценария JavaScript HTML-страницы, загруженной в элемент управления HTMLLoader, и ActionScript из содержимого SWF, вложенного в эту HTML-страницу.

В следующем примере демонстрируется процесс передачи данных между проигрывателем Flash Player и контейнером HTML. 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; public class ExternalInterfaceExample extends Sprite { private var input:TextField; private var output:TextField; private var sendBtn:Sprite; public function ExternalInterfaceExample() { 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"); Timer(event.target).stop(); } } private function clickHandler(event:MouseEvent):void { if (ExternalInterface.available) { ExternalInterface.call("sendToJavaScript", input.text); } } } } Чтобы проверить предыдущий код ActionScript, внедрите созданный SWF-файл с использованием следующего шаблона HTML: <!-- 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 thisMovie(movieName) { if (navigator.appName.indexOf("Microsoft") != -1) { return window[movieName]; } else { return document[movieName]; } } function sendToActionScript(value) { thisMovie("ExternalInterfaceExample").sendToActionScript(value); } function sendToJavaScript(value) { document.forms["form1"].output.value += "ActionScript says: " + value + "\n"; } </script> </head> <body onload="pageInit();"> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="ExternalInterfaceExample" width="500" height="375" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab"> <param name="movie" value="ExternalInterfaceExample.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#869ca7" /> <param name="allowScriptAccess" value="sameDomain" /> <embed src="ExternalInterfaceExample.swf" quality="high" bgcolor="#869ca7" width="500" height="375" name="ExternalInterfaceExample" align="middle" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"> </embed> </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>
fscommand()addCallback Регистрирует метод ActionScript, как вызываемый из контейнера.Контейнер не поддерживает входящие вызовы. Поддержка входящих вызовов присутствует только в браузере Internet Explorer для Windows и браузерах, использующих NPRuntime API, например Mozilla версии 1.7.5 или новее и Firefox версии 1.0 или новее. ErrorErrorВ ActionScript ответный вызов добавлен в изолированную программную среду безопасности с закрытым доступом, поэтому перезаписать данный ответный вызов невозможно. Для решения этой проблемы перепишите ActionScript так, чтобы вместо вызова метода addCallback() вызывался метод Security.allowDomain(). SecurityErrorSecurityErrorОкружение, в котором содержится элемент, принадлежит изолированной программной среде, к которой у вызывающего кода доступа нет. Для решения этой проблемы следуйте приведенным ниже инструкциям:
  1. В теге object SWF-файла на странице HTML настройте следующий параметр:

    <param name="allowScriptAccess" value="always" />

  2. Добавьте в SWF-файл следующий ActionScript:

    flash.system.Security.allowDomain(sourceDomain)

SecurityErrorSecurityError
functionNameStringИмя, по которому контейнер может осуществить вызов функции. closureFunctionВызываемое завершение функции. Это может быть как независимая функция, так и метод завершения, который ссылается на метод экземпляра объекта. Передав завершение метода, можно направить обратный вызов методу определенного экземпляра объекта.

Примечание. Повтор метода addCallback() для существующей функции обратного вызова с значением закрытия null удаляет обратный вызов.

Регистрирует метод ActionScript, как вызываемый из контейнера. После успешного вызова метода addCallBack() содержащимся в контейнере кодом JavaScript или ActiveX можно осуществить вызов зарегистрированной в проигрывателе функции.

Примечание. Для локального содержимого, запущенного в браузере, вызов метода ExternalInterface.addCallback() работает только тогда, когда файл и содержащая его web-страница находятся в локальной достоверной изолированной среде. Для получения дополнительной информации см. раздел центра разработчиков Flash Player Безопасность.

flash.system.Security.allowDomain()
call Вызывает функцию, предоставляемую контейнером SWF, передавая нуль или более аргументов.Контейнер не поддерживает исходящие вызовы. Поддержка исходящих вызовов присутствует только в браузере Internet Explorer для Windows и браузерах, использующих NPRuntime API, например Mozilla версии 1.7.5 или новее и Firefox версии 1.0 или новее. ErrorErrorОкружение, в котором содержится элемент, принадлежит изолированной программной среде, к которой у вызывающего кода доступа нет. Для решения этой проблемы следуйте приведенным ниже инструкциям:
  1. В теге object SWF-файла на странице HTML настройте следующий параметр:

    <param name="allowScriptAccess" value="always" />

  2. Добавьте в SWF-файл следующий ActionScript:

    flash.system.Security.allowDomain(sourceDomain)

SecurityErrorSecurityError
Ответ, полученный от контейнера. Если вызов функции не удался (такой функции в контейнере не существует, интерфейс недоступен, возникла рекурсия (при использовании браузера Netscape или Opera), реакция системы безопасности), возвращается null и появляется сообщение об ошибке. functionNameStringСимвольное имя вызываемой функции в контейнере. Использование имени функции, не содержащего буквенно-цифровые символы, является причиной ошибки этапа выполнения (ошибка 2155). Можно использовать блок try..catch для обработки ошибки. argumentsАргументы, передаваемые функции в контейнере. Можно указать 0 или несколько параметров, разделенных запятой. Они могут принадлежать любому типу данных ActionScript. При обращении к функции JavaScript типы данных ActionScript автоматически преобразуются в типы данных JavaScript. При обращении к какому-либо другому контейнеру параметры кодируются в сообщении запроса. Вызывает функцию контейнера.
Вызывает функцию, предоставляемую контейнером SWF, передавая нуль или более аргументов. При вызове недоступной функции возвращается значение null; в противном случае, значение данной функции. В браузерах Opera и Netscape рекурсия запрещена, поэтому рекурсивный вызов в данных браузера возвращает null. (В Internet Explorer и Firefox рекурсия поддерживается.)

Если в качестве контейнера выступает страница HTML, данный метод производит вызов функции JavaScript в элементе script.

Если в качестве контейнера выступает другой контейнер ActiveX, данный метод отправляет событие FlashCall ActiveX с заданным именем, и контейнер обрабатывает данное событие.

Если в контейнере содержится подключаемый модуль Netscape, можно запрограммировать пользовательскую поддержку нового интерфейса NPRuntime или внедрить управление HTML и встроить проигрыватель туда. После внедрения управления HTML можно осуществлять управление проигрывателем через интерфейс JavaScript собственного контейнера приложения.

Примечание. Для локального содержимого, запущенного в браузере, вызов метода ExternalInterface.call() работает только тогда, когда файл и содержащая его web-страница (при ее наличии) находятся в локальной доверенной изолированной среде. Вдобавок, чтобы SWF-файл не использовал этот метод, настройте параметр allowNetworking тегов object и embed HTML-страницы с SWF-содержимым. Для получения дополнительной информации см. раздел центра разработчиков Flash Player Безопасность.

Примечание для программ Flash Player. В Flash Player 10 и Flash Player 9 Update 5 некоторые браузеры запрещают этот метод, если включена блокировка всплывающих окон. В таком случае этот метод можно успешно вызвать только в ответ на пользовательское событие (например, в обработчике событий щелчка мыши или нажатия клавиши).

В следующем примере демонстрируется использование класса ExternalInterface (flash.external.ExternalInterface) для отправки строки из Flash Player в контейнер HTML, где она отображается с помощью функции alert() кода JavaScript. Пример предоставлен ActionScriptExamples.com. // // 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); }
marshallExceptions Определяет, будет ли внешний интерфейс пытаться обойти исключения ActionScript для текущего браузера и исключения JavaScript для проигрывателя.falseBooleanОбходит исключения между ActionScript и JavaScript. Определяет, будет ли внешний интерфейс пытаться обойти исключения ActionScript для текущего браузера и исключения JavaScript для проигрывателя. Для выявления исключений JavaScript в ActionScript и наоборот следует присвоить данному свойству значение true в явном виде. В данном примере создается функция ActionScript, которая регистрируется в содержащем ее браузере с помощью метода addCallback(). Новая функция приводит к исключению, а запущенный в браузере код JavaScript выявляет его. В данном примере также содержится оператор try..catch для выявления исключений браузера при вызове функции throwit(). 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!!!!") } } } addCallBack()try..catch.. finallyavailable Определяет, является ли этот проигрыватель контейнером, обеспечивающим работу внешнего интерфейса.BooleanОпределяет, находится ли проигрыватель в контейнере, обеспечивающем работу внешнего интерфейса. Определяет, является ли этот проигрыватель контейнером, обеспечивающим работу внешнего интерфейса. Если внешний интерфейс доступен, свойство принимает значение true; в противном случае — false.

Примечание. При использовании External API с HTML следует всегда дожидаться окончания загрузки HTML перед тем, как вызывать методы JavaScript.

В следующем примере для определения, поддерживает ли проигрыватель внешний интерфейс, используется свойство available. 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); } } }
objectID Возвращает атрибут id тега object в Internet Explorer или атрибут name тега embed в Netscape.String Возвращает атрибут id тега object в Internet Explorer или атрибут name тега embed в Netscape.