Отлавливаем JavaScript события из Flash/Flex приложения

Flex cookbook entry: Handling JavaScript events from a Flash/Flex application.

Для начала вам нужно скачать библиотеку JSInterface(находится в скачиваемом архиве) с официальной страницы проекта.

После установки библиотеки, перед её использованием, библиотеку необходимо инициализировать вызвав метод JSInterface.initialize(). Этот метод принимает любое значение, в качестве первого аргумента, которое может сообщить URL текущего приложения.

Значением первого аргумента JSInterface.initialize() может быть:

  • Любой DisplayObject добавленный на сцену
    JSInterface.initialize(this.stage);
  • Объект LoaderInfo данного приложения
    JSInterface.initialize(this.loaderInfo);
  • Или строка URL с которой было загружено данное приложение
    var url:String = "http://someserver.com/main.swf";
    JSInterface.initialize(url);

Этот аргумент необходим только в случаях, когда в HTML странице не был указан атрибут ID для данного SWF приложения. В стандартном HTML шаблоне к Flex Builder 3 атрибут ID встраивается автоматически.

Последнее, что нужно сделать, это реализовать необходимую функции обратного вызова и присвоить её нужному атрибуту. Для получения доступа к JavaScript объектам, нужно использовать класс JSInterface и любой из представленных глобальных объектов:

  • JSInterface.window - JavaScript window объект, используется как глобальный объект для всех объявленых JavaScript функций и свойств.
  • JSInterface.document - JavaScript document объект
  • JSInterface.navigator - JavaScript navigator объект
  • JSInterface.main - JavaScript HTMLElement объект, который содержит текущий экземпляр данного приложения

Пример подписки на событие onclick(щелчок мыши) на HTML странице:

  1. package {
  2. import aw.external.JSInterface;
  3.  
  4. import flash.display.Sprite;
  5.  
  6. [SWF(width="20", height="20")]
  7. public class Test extends Sprite{
  8. public function Test():void{
  9. super();
  10. JSInterface.initialize(this);
  11. JSInterface.document.body.onclick = this.onclickHandler;
  12. }
  13. protected function onclickHandler():void{
  14. trace(' TEST ');
  15. }
  16. }
  17. }

Этот пример может некорректно работать локально, в этом случае, запускайте его под HTTP протоколом. Некоторые браузеры в вызываемую функцию передают ссылку на объект event, описывающий данному событию:

  1. protected function onclickHandler(event:JSDynamic=null):void{
  2. trace(' TEST ');
  3. }

Этот же пример можно слегка изменить и отлавливать событие щелчка на кнопке или любом другом элементе страницы.

Добавляем кнопку к HTML шаблону:

 
<input type="button" id="clickButton" value="Click me!"/>

Подменяем JSInterface объект, используя ID кнопки:

	JSInterface.document.getElementById('clickButton').onclick = this.onclickHandler;

С помощью JSInterface можно использовать более развитый интерфейс для событийной модели JavaScript среды.

В новом проекте добавим в HTML шаблон простую таблицу:

  1.  
  2. <table id="table" width="500" height="500" bgcolor="#ffff88">
  3. <tr>
  4. <td align="center" valign="middle">
  5. <font size="+2">Click me!</font>
  6. </td>
  7. </tr>
  8. </table>
  9.  

А теперь изменим код приложения:

  1. package {
  2. import aw.external.JSInterface;
  3. import aw.external.jsinterface.JSDynamic;
  4.  
  5. import flash.display.Sprite;
  6. [SWF(width="10",height="10")]
  7. public class AddEventListenerExample extends Sprite{
  8. public function AddEventListenerExample():void{
  9. super();
  10. JSInterface.initialize(this);
  11. JSInterface.document.addEventListener(
  12. 'click',
  13. this.documentClickHandler,
  14. true
  15. );
  16. JSInterface.document.getElementById('table').addEventListener(
  17. 'click',
  18. this.tableClickHandler,
  19. true
  20. );
  21. }
  22. protected function documentClickHandler(event:JSDynamic=null):void{
  23. // Stop JavaScript click event.
  24. trace('Document clicked:', event);
  25. if(event){
  26. event.stopPropagation();
  27. JSInterface.window.alert('Event stopped!');
  28. }
  29. }
  30. protected function tableClickHandler(event:JSDynamic=null):void{
  31. trace('TABLE clicked:', event);
  32. }
  33. }
  34. }

Этот код вы можете опробовать скачав архив с примерами.

Метки: , , , , , ,

Добавить комментарий

Вы должны авторизоваться для отправки комментария.