Чем обработка событий в ActionScript 3.0 отличается от предыдущих версий

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

Наиболее заметное отличие обработки событий в ActionScript 3.0 от обработки событий в предыдущих версиях этого языка состоит в том, что в ActionScript 3.0 существует только одна система обработки событий, тогда как в предыдущих версиях ActionScript имеется несколько разных систем. Этот раздел начинается с обзора обработки событий в предыдущих версиях ActionScript, вслед за которым идет обсуждение изменений обработки событий в ActionScript 3.0.

Обработка событий в предыдущих версиях ActionScript

В версиях ActionScript, вышедших перед ActionScript 3.0, имеется ряд различных способов обработки событий:

  • обработчики событий on() , которые можно разместить непосредственно в экземплярах Button и MovieClip;

  • обработчики onClipEvent() , которые можно разместить непосредственно в экземплярах MovieClip;

  • свойства функции обратного вызова (например, XML.onload и Camera.onActivity );

  • прослушиватели событий, зарегистрированные с помощью метода addListener() ;

  • класс UIEventDispatcher, в котором частично реализована модель событий DOM.

Каждый из этих механизмов обладает собственным набором преимуществ и ограничений. Обработчики on() и onClipEvent() просты в применении, но усложняют последующую работу с проектами, поскольку код, который размещен непосредственно на кнопках и фрагментах роликов, бывает сложно найти. Функции обратного вызова легко реализуются, но для каждого события можно использовать только одну функцию обратного вызова. Прослушиватели событий реализуются сложнее: они требуют не только создания объекта прослушивателя и функции, но также и регистрации прослушивателя вместе с объектом, который генерирует событие. Однако это увеличение объема служебной информации позволяет создать несколько объектов прослушивателя и зарегистрировать их все для одного и того же события.

Разработка компонентов для ActionScript 2.0 привела к появлению еще одной модели событий. Эта новая модель, включенная в класс UIEventDispatcher, основана на подмножестве спецификации событий DOM. Разработчики, знакомые с обработкой компонентов событий, относительно безболезненно смогут перейти к новой модели событий в ActionScript 3.0.

К сожалению, в различных моделях событий используется синтаксис, который бывает то идентичным, то разным. Например, в ActionScript 2.0 некоторые свойства (например, TextField.onChanged ) могут применяться как функция обратного вызова либо как прослушиватель событий. Однако синтаксис для регистрации объектов прослушивателя отличается в зависимости от того, используется ли один из шести классов, поддерживающих прослушиватели, или класс UIEventDispatcher. Для классов Key, Mouse, MovieClipLoader, Selection, Stage и TextField применяется метод addListener() , а для обработки событий компонентов — метод addEventListener() .

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

Обработка событий в ActionScript 3.0

ActionScript 3.0 располагает единой моделью обработки событий, которая заменяет многие различные механизмы обработки событий, которые существовали в предыдущих версиях языка. Новая модель событий основана на спецификации событий из объектной модели документа (DOM) третьего уровня. Хотя формат SWF-файла не ориентирован специально на стандарт объектной модели документа, существует достаточное сходство между списком отображения и структурой DOM, обеспечивающее возможность реализации модели событий DOM. Объект в списке отображения аналогичен узлу в иерархической структуре DOM, а термины объект списка отображения и узел используются в качестве аналогов в рамках данного обсуждения.

Модель событий DOM, реализованная в программах Flash Player и AIR, включает понятие «вид поведения по умолчанию». Поведение по умолчанию — это действие, которое выполняется программами Flash Player или AIR в качестве нормальной последовательности определенных событий.

Варианты поведения по умолчанию

Обычно код, который отвечает на события, пишется разработчиком. Однако в ряде случаев поведение настолько часто ассоциируется с событием, что Flash Player или AIR автоматически выполняет его, если разработчик не добавляет код отмены. Поскольку Flash Player или AIR автоматически воспроизводит это поведение, подобные виды поведения называются видами поведения по умолчанию.

Например, когда пользователь вводит текст в объект TextField, настолько часто предполагается, что он будет показан в объекте TextField, что это поведение встраивается в Flash Player и AIR. Если вы не хотите, чтобы это поведение выполнялось, его можно отменить с помощью новой системы обработки событий. Когда пользователь вводит текст в объект TextField, Flash Player или AIR создают экземпляр класса TextEvent, отражающий введенные данные. Чтобы запретить этим программам показ текста в объекте TextField, необходимо открыть соответствующий экземпляр TextEvent и вызвать его метод preventDefault() .

Существуют поведения по умолчанию, которые нельзя отменить. Например, Flash Player и AIR генерируют объект MouseEvent, когда пользователь дважды щелкает слово в объекте TextField. Поведение по умолчанию, которое невозможно предотвратить, состоит из подсвечивания слова под курсором.

Многие типы объектов событий не имеют собственного поведения по умолчанию. Например, Flash Player отправляет объект события подключения при установке сетевого подключения, но с ним не связано поведение по умолчанию. В документации по API-интерфейсу класса Event и его подклассов перечисляются все события и связанное с каждым из них поведение по умолчанию, а также указывается, можно ли его отменить.

Важно понять, что виды поведения по умолчанию ассоциируются только с объектами событий, отправленными Flash Player или AIR, и не существуют для объектов событий, которые отправлены программным образом с помощью ActionScript. Например, можно воспользоваться методами класса EventDispatcher для отправки объекта события с типом textInput , но с этим объектом события не будет связано поведение по умолчанию. Иными словами, Flash Player и AIR не будут показывать символ в объекте TextField в результате события textInput , которое отправлено программным методом.

Новые функции прослушивателей событий в ActionScript 3.0

Для разработчиков, имеющих опыт использования метода addListener() в ActionScript 2.0, может оказаться полезным указать на различия между моделью прослушивателя событий ActionScript 2.0 и моделью событий ActionScript 3.0. В следующем списке описан ряд основных различий между двумя моделями событий:

  • Чтобы добавить прослушиватели событий в ActionScript 2.0, необходимо воспользоваться методом addListener() в одних случаях и методом addEventListener() в других. А в ActionScript 3.0 всегда применяется метод addEventListener() .

  • В ActionScript 2.0 нет потока событий. Это означает, что метод addListener() можно вызвать только по отношению к объекту, который выполняет широковещание события. В ActionScript 3.0 метод addEventListener() можно вызвать по отношению к любому объекту, включенному в поток событий.

  • В ActionScript 2.0 в качестве прослушивателей событий могут выступать функции, методы или объекты, тогда как в ActionScript 3.0 прослушивателями событий могут быть только функции или методы.