Обработка в AIR событий HTML

Adobe AIR 1.0 и более поздних версий

Система обработки событий облегчает для программистов процедуру ответа на действия пользователя и события системы. Модель событий Adobe® AIR® не только удобна, но и соответствует принятым стандартам. Модель событий, основанная на Спецификации событий DOM 3-го уровня — архитектуре обработки событий, принятой в отрасли, — предоставляет эффективный и несложный инструмент обработки событий для программистов.

События HTMLLoader

Объект HTMLLoader отправляет следующие события Adobe® ActionScript® 3.0:

Событие

Описание

htmlDOMInitialize

Отправляется после создания HTML-документа, но до разбора каких-либо сценариев или добавления к странице узлов DOM.

complete

Отправляется при создании модели DOM HTML в ответ на загрузку, сразу после выполнения события onload на HTML-странице.

htmlBoundsChanged

Отправляется при изменении одного из свойств contentWidth и contentHeight или обоих этих свойств.

locationChange

Отправляется при изменении свойства location объекта HTMLLoader.

locationChanging

Отправляется перед изменением расположения HTMLLoader в связи с навигацией пользователя, вызовом сценария JavaScript или перенаправлением. Событие locationChanging не отправляется при вызове методов load() , loadString() , reload() , historyGo() , historyForward() или historyBack() .

Вызов метода preventDefault() отправленного объекта события отменяет навигацию.

Если ссылка открыта в системном браузере, событие locationChanging не отправляется, поскольку HTMLLoader не изменяет расположение.

scroll

Отправляется при любом изменении положения прокрутки в HTML. События scroll могут быть вызваны переходами по якорным ссылкам (содержащим символ # ) на странице или в результате вызова метода window.scrollTo() . Ввод текста в текстовое поле или область также может вызывать событие scroll.

uncaughtScriptException

Отправляется при генерации в объекте HTMLLoader исключения JavaScript, которое не обнаруживается кодом JavaScript.

Также можно зарегистрировать функцию ActionScript для события JavaScript (например, onClick ). Дополнительные сведения см. в разделе Обработка событий DOM с помощью ActionScript .

Обработка событий DOM с помощью ActionScript

Функции ActionScript могут быть зарегистрированы для ответа на события JavaScript. Например, рассмотрим следующее HTML-содержимое:

<html> 
<body> 
    <a href="#" id="testLink">Click me.</a> 
</html>

Функция ActionScript может быть зарегистрирована в качестве обработчика любого события на этой странице. Например, в коде ниже функция clickHandler() добавляется на HTML-страницу в качестве прослушивателя события onclick элемента testLink :

var html:HTMLLoader = new HTMLLoader( ); 
var urlReq:URLRequest = new URLRequest("test.html"); 
html.load(urlReq); 
html.addEventListener(Event.COMPLETE, completeHandler); 
 
function completeHandler(event:Event):void { 
    html.window.document.getElementById("testLink").onclick = clickHandler; 
} 
 
function clickHandler( event:Object ):void { 
    trace("Event of type: " + event.type ); 
}

Отправляемый объект события не является типом flash.events.Event или одним из подклассов Event. Используйте класс Object для объявления типа аргумента функции обработчика событий.

Для регистрации прослушивателей этих событий также может использоваться метод addEventListener() . Например, метод completeHandler() из предыдущего примера может быть заменен:

function completeHandler(event:Event):void { 
    var testLink:Object = html.window.document.getElementById("testLink"); 
    testLink.addEventListener("click", clickHandler); 
}

Когда прослушиватель обращается к какому-либо элементу DOM, рекомендуется дождаться, пока родительский объект HTMLLoader отправит событие complete , и только после этого добавлять прослушиватели. HTML-страницы часто загружают несколько файлов, а модель DOM в HTML не может быть полностью построена, пока все файлы не будут загружены и разобраны. Объект HTMLLoader отправляет событие complete , когда все элементы уже созданы.

Ответ на необрабатываемые исключения JavaScript

Рассмотрим следующий HTML-документ:

<html> 
<head> 
    <script> 
        function throwError() { 
            var x = 400 * melbaToast; 
        } 
    </script> 
</head> 
<body> 
    <a href="#" onclick="throwError()">Click me.</a> 
</html>

Он содержит функцию JavaScript throwError() , обращающуюся к неизвестной переменной melbaToast :

var x = 400 * melbaToast;

Когда операция JavaScript сталкивается с недопустимой операцией, которую код JavaScript не обрабатывает с помощью структуры try / catch , объект HTMLLoader, в котором содержится страница, отправляет событие HTMLUncaughtScriptExceptionEvent. Для этого события можно зарегистрировать прослушиватель, как показано ниже:

var html:HTMLLoader = new HTMLLoader(); 
var urlReq:URLRequest = new URLRequest("test.html"); 
html.load(urlReq); 
html.width = container.width; 
html.height = container.height; 
container.addChild(html); 
html.addEventListener(HTMLUncaughtScriptExceptionEvent.UNCAUGHT_SCRIPT_EXCEPTION, 
                           htmlErrorHandler); 
function htmlErrorHandler(event:HTMLUncaughtJavaScriptExceptionEvent):void  
{ 
    event.preventDefault(); 
    trace("exceptionValue:", event.exceptionValue) 
    for (var i:int = 0; i < event.stackTrace.length; i++) 
    { 
        trace("sourceURL:", event.stackTrace[i].sourceURL); 
        trace("line:", event.stackTrace[i].line); 
        trace("function:", event.stackTrace[i].functionName); 
    } 
}

В JavaScript можно обрабатывать одно и то же событие с помощью свойства window.htmlLoader:

<html> 
<head> 
<script language="javascript" type="text/javascript" src="AIRAliases.js"></script> 
 
    <script> 
        function throwError() { 
            var x = 400 * melbaToast; 
        } 
         
        function htmlErrorHandler(event) { 
            event.preventDefault(); 
            var message = "exceptionValue:" + event.exceptionValue + "\n"; 
            for (var i = 0; i < event.stackTrace.length; i++){ 
                message += "sourceURL:" + event.stackTrace[i].sourceURL +"\n"; 
                message += "line:" + event.stackTrace[i].line +"\n"; 
                message += "function:" + event.stackTrace[i].functionName + "\n"; 
            } 
            alert(message); 
        } 
         
        window.htmlLoader.addEventListener("uncaughtScriptException", htmlErrorHandler); 
    </script> 
</head> 
<body> 
    <a href="#" onclick="throwError()">Click me.</a> 
</html>

Обработчик события htmlErrorHandler() отменяет поведение события по умолчанию (т. е. отправку сообщения об ошибке JavaScript в выводе трассировочных данных AIR) и генерирует собственное сообщение об ошибке вывода. Выводится значение exceptionValue объекта HTMLUncaughtScriptExceptionEvent. Выводятся свойства каждого объекта в массиве stackTrace :

exceptionValue: ReferenceError: Can't find variable: melbaToast 
sourceURL: app:/test.html 
line: 5 
function: throwError 
sourceURL: app:/test.html 
line: 10 
function: onclick

Обработка событий среды выполнения с помощью JavaScript

Классы среды выполнения позволяют добавлять обработчики событий методом addEventListener() . Для добавления функции обработчика события вызовите метод addEventListener() объекта, который отправляет это событие, указав тип события и функцию обработчика. Например, чтобы прослушивать событие closing , отправляемое по щелчку мыши на значке закрытия окна, воспользуйтесь следующей инструкцией:

window.nativeWindow.addEventListener(air.NativeWindow.CLOSING, handleWindowClosing);

Создание функции обработчика события

Ниже показан код, в котором создается простой HTML-файл, отображающий информацию о положении главного окна. Функция обработчика moveHandler() прослушивает событие move (определено в классе NativeWindowBoundsEvent) главного окна.

<html> 
    <script src="AIRAliases.js" /> 
    <script> 
        function init() { 
            writeValues(); 
            window.nativeWindow.addEventListener(air.NativeWindowBoundsEvent.MOVE, 
                                                     moveHandler); 
        } 
        function writeValues() { 
            document.getElementById("xText").value = window.nativeWindow.x; 
            document.getElementById("yText").value = window.nativeWindow.y; 
        } 
        function moveHandler(event) { 
            air.trace(event.type); // move 
            writeValues(); 
        } 
    </script> 
    <body onload="init()" /> 
        <table> 
            <tr> 
                <td>Window X:</td> 
                <td><textarea id="xText"></textarea></td> 
            </tr> 
            <tr> 
                <td>Window Y:</td> 
                <td><textarea id="yText"></textarea></td> 
            </tr> 
        </table> 
    </body> 
</html>

Когда пользователь смещает окно, элементы textarea отображают новые положения по осям X и Y для этого окна:

Обратите внимание, что объект события передается методу moveHandler() в качестве аргумента. Параметр события позволяет функции обработчика исследовать объект события. В этом примере свойство type объекта события указывает, что событие относится к типу move .

Удаление прослушивателей событий

Метод removeEventListener() можно использовать для удаления неиспользуемых прослушивателей событий. Ненужные прослушиватели рекомендуется удалять. Обязательными являются параметры eventName и listener — как и для метода addEventListener() .

Удаление прослушивателей событий на HTML-страницах с навигацией

При навигации по HTML-содержимому или его сбрасывании из-за закрытия содержащего его окна прослушиватели событий, указывающие на объекты на незагруженной странице, не удаляются автоматически. Когда объект отправляет событие уже выгруженному обработчику, появляется следующее сообщение об ошибке: «Приложение ссылается на объект JavaScript на HTML-странице, которая более не загружена».

Чтобы эта ошибка не возникала, удалите прослушиватели событий JavaScript с HTML-страницы, прежде чем она будет закрыта. При навигации по странице (в объекте HTMLLoader) удалите прослушиватель во время события unload объекта window .

Например, показанный ниже код JavaScript удаляет прослушиватель события uncaughtScriptException :

window.onunload = cleanup; 
window.htmlLoader.addEventListener('uncaughtScriptException', uncaughtScriptException); 
function cleanup() 
{ 
    window.htmlLoader.removeEventListener('uncaughtScriptException', 
                            uncaughtScriptExceptionHandler); 
}

Чтобы эта ошибка не возникала при закрытии окон с HTML-содержимым, вызовите функцию cleanup в ответ на событие closing объекта NativeWindow ( window.nativeWindow ). Например, показанный ниже код JavaScript удаляет прослушиватель события uncaughtScriptException :

window.nativeWindow.addEventListener(air.Event.CLOSING, cleanup); 
function cleanup() 
{ 
    window.htmlLoader.removeEventListener('uncaughtScriptException', 
                            uncaughtScriptExceptionHandler); 
}

Вы также можете предупредить эту ошибку удалением прослушивателя события, как только он запустится (если событие требует лишь разовой обработки). Например, в следующем коде JavaScript окно HTML создается в результате вызова метода createRootWindow() класса HTMLLoader и добавления прослушивателя события complete . При вызове обработчика события complete он удаляет собственный прослушиватель с помощью функции removeEventListener() :

var html = runtime.flash.html.HTMLLoader.createRootWindow(true); 
html.addEventListener('complete', htmlCompleteListener); 
function htmlCompleteListener() 
{ 
    html.removeEventListener(complete, arguments.callee) 
    // handler code.. 
} 
html.load(new runtime.flash.net.URLRequest("second.html"));

Удаление ненужных прослушивателей событий также позволяет системному сборщику мусора восстанавливать память, занятую этими прослушивателями.

Проверка существующих прослушивателей событий

Метод hasEventListener() позволяет проверить, зарегистрирован ли для объекта прослушиватель.