ИГРОДЕЛ
Войдите на сайт или зарегистрируйтесь!!!

Join the forum, it's quick and easy

ИГРОДЕЛ
Войдите на сайт или зарегистрируйтесь!!!
ИГРОДЕЛ
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

ActionScript 3.0. Урок 8-3. Передача событий

Перейти вниз

ActionScript 3.0. Урок 8-3. Передача событий Empty ActionScript 3.0. Урок 8-3. Передача событий

Сообщение автор Admin Вс Фев 21, 2010 4:19 am

Нововведением является также поддержка передачи событий для объектов отображения. Передача событий – это процесс, при котором одно событие проходит по иерархии объектов, вместо того, чтобы быть ограниченным одним порождающим объектом. В ActionScript 3, например, если внутри клипа имеется кнопка, и вы щелкаете по ней, эта кнопка пошлет событие click. Помимо кнопки, по которой щелкнули, событие click получат также клип, внутри которого она существует, его родитель, если он существует, и так далее, пока не кончатся родители, которых может достичь событие. Это существенное изменение по сравнению с тем, как события, особенно события для кнопок, такие как onPress, onRelease, onRollOver, и т. д. работали в ActionScript 2. Далее, любой объект-родитель, связанный с обработчиком для этих событий предотвратит передачу событий своим потомкам.

картинка https://i.servimg.com/u/f69/14/89/42/41/graphi10.png


Рисунок: События в ActionScript 3 теперь могут передаваться к родительским экземплярам

Потребуется некоторое время, чтобы привыкнуть к такому поведению, так как события, которые передаются (но не все события передаются), запускаются внезапно, в то время как потомки вашего целевого объекта посылают их. Если вы хотите посмотреть, исходит ли событие от объекта, который вы прослушиваете, вам остается только сравнить свойства target и currentTarget объекта Event, записанные в ваш обработчик событий. Свойство target показывает объект, из которого происходит событие, а свойство currentTarget ссылается на объект, получающий в данный момент событие, или объект, который вы используете вместе с addEventListener.

// Detecting when an event hasn't been propagated
function handler(event:Event):void {
if (event.target == event.currentTarget) {
// event came from object
// addEventListener was used with and
// is not result of propagation
}
}


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


Передача осуществляется в три фазы: фаза захвата (capture phase), целевая фаза (target phase) и фаза пузырька (bubbling phase). Фаза захвата наступает, когда событие стартует сверху таблицы отображения с наивысшего родителя и движется вниз по своим потомкам, пока не будет достигнуто, но не включено, целевое событие, от которого произошло текущее событие. При нахождении события на цели наступает целевая фаза. Хотя фаза захвата может включать несколько объектов отображения, целевая фаза включает только один. Между фазой захвата и целевой фазой располагаются все объекты отображения, которые подвергаются воздействию со стороны переданного события. Тем не менее, после достижения цели событие не останавливается, а продолжает работать, но в обратном направлении по иерархии, проходя по родителям, пока не останется ни одного из них. Она известна как фаза пузырька. Это означает, что нецелевой объект, подвергшийся воздействию передающегося события, получает это событие дважды, один раз во время фазы захвата, а второй раз во время фазы пузырька.

Когда вы используете addEventListener для привязки обработчиков событий к прослушиванию событий, по умолчанию, вы слушаете события только внутри целевой фазы и фазы пузырька. Это означает, что передача событий с использованием addEventListener по умолчанию начнется с цели, а затем будет направлено каждому родителю этой цели. Если вы хотите, чтобы обработчик прислушивался к событиям в фазе захвата, то для событий, достигающих родителей прежде достижения цели нужно определить addEventListener, который вы хотите использовать для фазы захвата, прописывая true для его третьего параметра, параметра useCapture. Если вы хотите прослушивать события на всех фазах, нужно дважды добавить addEventListener, один раз используя useCapture (false) по умолчанию, и второй раз, установив useCapture в true.

// Default phases: target and bubbling
object.addEventListener(MouseEvent.CLICK, onClick);
// Also listen for events in capture phase
object.addEventListener(MouseEvent.CLICK, onClick, true);

Обратите внимание, что установив значение useCapture в true для addEventListener, вы не получите событий для целевого экземпляра, а только для его родителей. События целевого экземпляра будут обрабатываться в листенере, добавленном при помощи useCapture, при значении false, так как в этом случае обрабатывается целевая фаза и фаза пузырька.

картинка https://i.servimg.com/u/f69/14/89/42/41/graphi11.png

Рисунок: Фазы события в иерархии таблицы отображения

Так как целевая фаза события возникает только для экземпляра объекта, в котором порождено событие, наряду со сравниванием свойств event.target и event.currentTarget, может использоваться свойство event.eventPhase, для просмотра того, был ли вызван обработчик для целевого экземпляра. Оно содержит число, представляющее текущую фазу события. Эти значения хранятся в более читабельных переменных, расположенных в классе EventPhase в качестве EventPhase.CAPTURING_PHASE, EventPhase.AT_TARGET, и EventPhase.BUBBLING_PHASE.

function handler(event:Event):void {
if (event.eventPhase == EventPhase.AT_TARGET) {
// event came from object
// addEventListener was used with and
// is not result of propagation
}
}
Admin
Admin
Admin

Сообщения : 92
Очки : 280
Репутация : 36
Дата регистрации : 2010-02-20

https://game-dll.forum2x2.ru

Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения