65. Event Part4. Отмена события на полпути. stopPropagation, stopImmediatePropagation

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

Как вы помните из второй статьи серии Event, распространение событий делится на три фазы: захват, цель и пузыри. Часто случается так, что в определенный момент необходимо отменить дальнейшее распространение события. Попробую привести реальный пример с кодом ActionScript 3.0, что бы понять для чего это может понадобится.

Допустим у вас на stage лежит спрайт с именем parentView. Внутри parentView лежит другой спрайт: childView. Вы слушаете событие MouseEvent.CLICK на объектах parentView и childView. Вот как выглядит ActionScript код этого примера:

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

В этом примере если вы кликните на синий прямоугольник(parentView), сработает только обработчик parentClickHandler. Если же вы кликните на желтый прямоугольник(childView), то тогда сработают два обработчика, сперва childClickHandler, а затем parentClickHandler. Это происходит потому что обработчик childClickHandler срабатывает в фазе цели, а обработчик parentClickHandler – в фазе пузырей. Т.е. событие дойдя до цели – всплывает как пузыри в воде. Подробнее про фазы событий можно почитать в статье Event Part2. Три фазы событий ActionScript. useCapture. Посмотрите на схеме как это работает:
event-part4-1

Если вам необходимо сделать так что бы при клике на childView, всплытие события не происходило, т.е. что бы объект parentView не получил события MouseEvent.CLICK, необходимо в обработчике childClickHandler вызвать метод event.stopPropagation(); :

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

Метод stopPropagation() объекта класса MouseEvent, блокирует дальнейшее распространение события вверх по иерархии списка отображения:
event-part4-2

Рассмотрим пример более сложный. Допустим где то в другом месте есть еще один слушатель события MouseEvent.CLICK на объекте childView.

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

В этом случае, если в момент когда срабатывает обработчик childClickHandler, вы хотите сделать так что бы больше ни кто не получил событие MouseEvent.CLICK, вам надо в обработчике childClickHandler вызывать метод event.stopImmediatePropagation(); вместо event.stopPropagation();. В этом случае при клике на желтый прямоугольник(childView) не сработают ни parentClickHandler ни childClickHandler2, а только childClickHandler.

Имейте ввиду, для того что бы childClickHandler блокировал распространение события на обработчик childClickHandler2, необходимо что бы обработчик childClickHandler сработал раньше чем childClickHandler2. Это можно сделать указав приоритет(priority) обработчика события. Подробнее про приоритет(priority) читайте в статье Event Part3. Приоритет события. priority

Да прeбудет с вами Flash.
Serious Sam
Эту статью прочитали 1498 раз

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

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


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




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




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