45. Event Part2. Три фазы событий ActionScript. useCapture

junior – серия статей для начинающих ActionScript-разработчиков.
Все статьи серии:
http://flashpress.ru/blog/category/junior/

В предыдущей статье мы разбирали общие принципы работы событий в коде ActionScript3.0. Так же мы рассмотрели метод addEventListener. У этого метода много интересных параметров. Первые два обязательных параметра параметры мы рассмотрели в предыдущей статье серии. В этой мы подробно разберем для чего же предназначен третий(необязательный) параметр useCapture.

И так, давайте рассмотрим ActionScript-код в котором в главном классе ( на главном таймлайне) имеется спрайт-контейнер с именем parentView. Внутри него имеются два спрайта с именами childView1 и childView2. Внутри спрайта childView1 есть спрайт с именем subchildView. Рассмотрим ситуацию когда мы кликаем на объекте childView1, и разберем в деталях что же происходит в этот момент.

FlashBuilderFlashIDE
Код для редактора Adobe FlashBuilder
Код для редактора Adobe Flash CS Professional

Иерархия объектов схематически показана на следующей картинке:
event-part1-1

В этой схеме под объектом root понимается базовый класс флешки (MainView, или timeline document если вы используете FlashIDE), и он создаётся автоматически когда вы создаете Flash-приложение.

Когда вы кликаете на спрайте childView1, создается объект event:MouseEvent. Далее этот объект проходит по всем визуальным объектам по иерархии от stage до целевого спрайта(до childView1). Целевой объект(childView1) получает событие. Затем этот же объект event передается всем родителям по иерархии в обратном порядке:
event-part1-2

В итоге получили что события Event в ActionScript имеют три фазы. Первая фаза, когда событие спускается сверху вниз называется фазой захвата(capture). Вторая фаза когда событие добралось до нашего целевого объекта(childView1) называется фаза цели(target). И третья фаза, когда событие поднимается снизу вверх, называется фаза пузырей(bubbles). Когда вы используете метод addEventListener с третьим параметром по умолчанию false, вы слушаете событие в фазах цели и пузырей.

Что бы слушать событие в фазе захвата, необходимо в методе addEventListener третьим параметром передать значение true. Рассмотрим следующий код.

FlashBuilderFlashIDE
Код для редактора Adobe FlashBuilder
Код для редактора Adobe Flash CS Professional

Если кликнуть на объект childView1, то сперва сработает событие в фазе захвата у объекта parentView. Затем мы получим событие в фазе цели у объекта childView1. После чего событие сработает у объекта stage в фазе пузырей.
В коне Output мы получим значения:

parentClickHandler
childView1ClickHandler
stageClickHandler
Не забывайте что событие в фазе захвата и в фазе пузырей получат все родители объекта childView1, т.е. объекты parentView, root и stage.

Фазу захвата можно применить например если вам необходимо сделать так, что бы все дочерние элементы не получали событие CLICK. Что бы это реализовать, необходимо у родителя слушать событие CLICK в фазе захвата, и останавливать его с помощью метода event.stopPropogation(). Подробно про методы остановки событий вы можете прочитать в следующей статье серии. Так же в следующей статье мы разберем четвертый параметр метода addEventListener – priority, приоритет обработчика события.

Да прeбудет с вами Flash.
Serious Sam

Эту статью прочитали 1618 раз

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

Присоединяйтесь к нам в социальных сетях: ВКонтакте , Twitter и Facebook
Понравилась статья? Буду благодарен если вы поделитесь ссылкой с друзьями:


Комментарии ВКонтакте:




Комментарии Facebook:




Комментарии WordPress:


  1. Andrus

    “…Когда вы кликаете на спрайте childView1, создается объект event:MouseEvent. Далее этот объект проходит по всем визуальным объектам по иерархии от stage до целевого спрайта(до childView1). Целевой объект(childView1) отправляет событие. Затем этот же объект event передается всем родителям по иерархии в обратном порядке:…”

    Может имелось ввиду “…Целевой объект(childView1) ПОЛУЧАЕТ событие…” ?