Объекты Event

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

Объекты событий служат двум основным целям в новой системе обработки событий. Во-первых, объекты событий представляют действительные события, сохраняя информацию о тех или иных событиях в наборе свойств. Во-вторых, объекты событий содержат ряд методов, позволяющих управлять ими и изменять поведение системы обработки событий.

Чтобы упростить доступ к этим свойствам и методам, Flash Player API определяет класс Event, который выступает в качестве базового класса для всех объектов событий. Класс Event определяет фундаментальный набор свойств и методов, общих для всех объектов событий.

Этот раздел начинается с описания свойств класса Event, вслед за которым следует описание методов класса Event, и завершается сведениями о том, почему существуют подклассы класса Event.

Описание свойств класса Event

Класс Event определяет ряд свойств и констант только для чтения, которые содержат важные сведения об объекте события. Наиболее важными являются следующие:

  • Типы объекта Event представлены константами и сохраняются в свойстве Event.type .

  • Если поведение события по умолчанию можно предотвратить, это выражается логическим значением, которое сохраняется в свойстве Event.cancelable .

  • Информация о потоке событий содержится в сохраняющихся свойствах.

Типы объектов Event

С каждым объектом события связан определенный тип события. Типы событий хранятся в свойстве Event.type в виде строк. Знать тип события нужно для того, чтобы написанный код отличал объекты разного типа друг от друга. Например, в следующем коде указано, что функция прослушивателя clickHandler() должна реагировать на любые объекты событий щелчка мышью, которые передаются myDisplayObject :

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

С самим классом Event связано около 24 типов событий, которые представлены константами класса Event. Некоторые из них показаны в следующем фрагменте определения класса Event:

package flash.events 
{ 
    public class Event 
    { 
        // class constants 
        public static const ACTIVATE:String = "activate"; 
        public static const ADDED:String= "added"; 
        // remaining constants omitted for brevity 
    } 
}

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

myDisplayObject.addEventListener(MouseEvent.CLICK, clickHandler);

а не

myDisplayObject.addEventListener("click", clickHandler);

Информация о поведении по умолчанию

Код способен проверить, могло ли поведение по умолчанию для того или иного объекта события быть отменено через свойство cancelable . Свойство cancelable содержит логическое значение, которое указывает, можно или нет предотвратить поведение по умолчанию. Поведение по умолчанию, связанное с несколькими событиями сразу, можно отменить с помощью метода preventDefault() . Дополнительные сведения см. в пункте «Отмена поведения события по умолчанию» раздела Описание методов класса Event .

Информация о потоке событий

Оставшиеся свойства класса Event содержат важную информацию об объекте события и его отношении к потоку событий, как указано в следующем списке:

  • Свойство bubbles содержит сведения о стадиях потока событий, в которых принимает участие объект события.

  • Свойство eventPhase указывает на текущую фазу в потоке событий.

  • Свойство target сохраняет ссылку на цель события.

  • Свойство currentTarget ссылается на объект списка отображения, который в данный момент обрабатывает объект события.

Свойство bubbles

Говорят, что событие перемещается вверх, если его объект события участвует в фазе восходящей маршрутизации потока событий. Это означает, что объект события передается из узла цели обратно через родительские элементы до тех пор, пока не достигнет рабочей области. Свойство Event.bubbles содержит сведения о логическом значении, указывающем на участие объекта событий в фазе восходящей маршрутизации. Поскольку все движущиеся вверх события участвуют также в фазах захвата и цели, любое движущееся вверх событие принимает участие во всех трех фазах потока событий. Если выбрано значение true , объект события участвует во всех трех фазах. Если присвоено значение false , объект события не участвует в фазе восходящей маршрутизации.

Свойство eventPhase

Фазу события для любого объекта события можно определить путем изучения его свойства eventPhase . Свойство eventPhase содержит целое число без знака, представляющее одну из трех фаз потока событий. Flash Player API определяет отдельный класс EventPhase, который содержит три константы, соответствующие трем целым значениям без знака, как указано в следующем фрагменте кода:

package flash.events 
{ 
    public final class EventPhase 
    { 
        public static const CAPTURING_PHASE:uint = 1; 
        public static const AT_TARGET:uint = 2; 
        public static const BUBBLING_PHASE:uint= 3; 
    } 
}

Эти константы соответствуют трем действительным значениям свойства eventPhase . Эти константы можно использовать, чтобы сделать ваш код более читабельным. Например, если необходимо убедиться в том, что функция с именем myFunc() вызывается только тогда, когда цель события находится в его целевой рабочей области, можно воспользоваться следующим кодом для проверки данного условия:

if (event.eventPhase == EventPhase.AT_TARGET) 
{ 
    myFunc(); 
}

Целевое свойство

Свойство target имеет ссылку на объект, являющийся целью события. В ряде случаев она дается напрямую (например, при активации микрофона целью объекта события становится объект Microphone). Однако если цель находится в списке отображения, необходимо учесть иерархию списка отображения. Например, если пользователь вводит данные о щелчке мыши в тот момент, когда объекты списка отображения перекрываются, Flash Player и AIR всегда выбирают в качестве цели события объект, который находится дальше всего от рабочей области.

В случае сложных SWF-файлов, особенно когда кнопки в них, как это бывает, украшены меньшими по размеру дочерними объектами, свойство target нельзя использовать часто, поскольку оно будет время от времени указывать на дочерний объект кнопки вместо самой кнопки. В этих ситуациях чаще всего к кнопке добавляются прослушиватели событий и используется свойство currentTarget , поскольку оно указывает на кнопку, тогда как свойство target может указывать на дочерний объект кнопки.

Свойство currentTarget

Свойство currentTarget содержит ссылку на объект, который в данный момент обрабатывает объект события. Хотя может показаться странным не знать, какой узел в данный момент обрабатывает изучаемый объект события, учтите, что вы можете добавить функцию прослушивателя к любому экранному объекту в потоке событий для данного объекта события, и эту функцию можно разместить в любом месте. Более того, одну и ту же функцию прослушивателя можно добавить к разным экранным объектам. По мере того, как размер и сложность проекта увеличиваются, свойство currentTarget становится все более и более полезным.

Описание методов класса Event

Методы класса Event делятся на три категории:

  • Служебные методы: создают копии объекта события или преобразуют его в строку.

  • Методы потока событий, которые удаляют объекты событий из потока событий.

  • Методы поведения по умолчанию: отменяют поведение по умолчанию или проверяют, отменено ли оно.

Служебные методы класса Event

В классе Event существует два служебных метода. Метод clone() позволяет создавать копии объекта события. Метод toString() позволяет создавать строковое представление свойств объекта события и их значений. Оба этих метода применяются внутренним образом в системе модели событий, но разработчики могут найти им и более общее применение.

Опытным пользователям, создающим подклассы класса Event, необходимо переопределить и реализовать версии обоих служебных методов, чтобы гарантировать правильную работу подкласса события.

Остановка потока событий

Чтобы предотвратить дальнейшее перемещение объекта события в потоке событий, можно вызвать метод Event.stopPropagation() или метод Event.stopImmediatePropagation() . Два этих метода практически идентичны и отличаются только тем, разрешено ли выполнение других прослушивателей событий для текущего узла:

  • Метод Event.stopPropagation() предотвращает перемещение объекта события к следующему узлу. Это происходит только после того, как разрешается выполнение любых прослушивателей событий в текущем узле.

  • Метод Event.stopImmediatePropagation() предотвращает также перемещение объекта события к следующему узлу, но не разрешает выполнение любых других прослушивателей событий в текущем узле.

Вызов любого из этих методов не влияет на выполнение поведения по умолчанию, связанного с событием. Чтобы предотвратить поведение по умолчанию, воспользуйтесь методами класса Event, связанными с поведением по умолчанию.

Отмена поведения по умолчанию

С отменой поведения по умолчанию связаны два метода: preventDefault() и isDefaultPrevented() . Метод preventDefault() отменяет поведение по умолчанию, связанное с событием. Чтобы убедиться в том, что метод preventDefault() уже вызван для объекта события, вызовите метод isDefaultPrevented() , возвращающий значение true , если этот метод уже был вызван, и значение false в противном случае.

Метод preventDefault() будет работать только в том случае, если поведение по умолчанию отменено. Убедиться в наличии подобной ситуации можно путем ссылки на документацию API для типа события или путем использования ActionScript для изучения свойства cancelable объекта события.

Отмена поведения по умолчанию никак не влияет на ход объекта события в потоке. Методы потока событий класса Event удаляют объект события из потока.

Подклассы класса Event

Многим событиям достаточно общего набора свойств, определенного классом Event. Однако другие события обладают уникальными характеристиками, которые невозможно зарегистрировать в свойствах, доступных в классе Event. Для этих событий в языке ActionScript 3.0 определено несколько подклассов, расширяющих класс Event.

Каждый подкласс содержит дополнительные свойства и типы событий, уникальные для этой категории событий. Например, события, которые имеют отношение к мыши, имеют несколько уникальных характеристик, которые невозможно записать в свойства, определенные в классе Event. Класс MouseEvent является расширением класса Event. В него добавлены десять свойств, которые содержат такие сведения, как местоположение события мыши и нажатие определенных клавиш во время события мыши.

Подкласс Event содержит также константы, которые представляют типы событий, связанные с подклассом. Например, класс MouseEvent определяет константы для ряда типов событий мыши, включая click , doubleClick , mouseDown и mouseUp .

Как описано в пункте Объекты Event раздела «Служебные методы класса Event», при создании подкласса Event необходимо переопределить методы clone() и toString() , чтобы обеспечить функциональные возможности для этого подкласса.