Руководство по actionscript. часть 4, стр. 003

Теперь предположим, что пользователь вводит некий текст в объект TextField, в результате чего среда Flash вынуждена выполнить диспетчеризацию события TextEvent. TEXT INPUT, получателем которого является объект TextField. Поскольку объект TextField является частью иерархии отображения, событие передается по цепочке диспетчеризации события. В первой фазе процесса (фазе захвата) уведомление о возникновении события сначала получает экземпляр класса Stage, а затем — экземпляр класса Sprite. Во второй фазе (фазе получения) уведомление о возникновении события получает сам объект TextField. Наконец, в третьей фазе процесса (фазе всплытия) уведомление о том, что получатель был уведомлен о возникновении события, сначала получает экземпляр класса Sprite, а затем — экземпляр класса Stage. Всего в процессе диспетчеризации события TextEvent. TEXT INPUT происходит пять уведомлений о возникновении события, как показано на рис. 21.2.

Экземпляр I класса Stagel

Рис. 21.1. Пример иерархии отображения

Фаза захвата

Уведомлен экземпляр класса Stage

Экземпляр класса Stagel

Уведомлен объект Sprite

Уведомлен экземпляр класса Stage

t

Объект Sprite

Уведомлен объект Sprite

А

Объект TextField

Уведомлен объект TextField

Фаза всплытия

Фаза получения

Рис. 21.2. Цепочка диспетчеризации для события TextEvent. TEXT_INPUT

Приемники событий и цепочка диспетчеризации событий

Как мы только что увидели, в процессе диспетчеризации события, получателем которого является некоторый отображаемый объект, отображаемые предки этого

объекта получают уведомление о возникновении события на фазе захвата и теоретически на фазе всплытия (если событие является всплывающим). Соответственно, при регистрации приемника в предке получателя события мы должны указать, когда вызывать этот приемник — в фазе захвата или в фазе всплытия.

Руководство по actionscript. часть 4, стр. 004

Чтобы зарегистрировать приемник в предке получателя события для фазы захвата диспетчеризации события, мы устанавливаем третьему параметру useCapture метода addEventListener ( ) значение true, как показано в следующем коде:

предок. addEventListener(событие, приемник, true)

Эта строка кода заставляет метод приемник( ) выполняться всякий раз, когда среда Flash осуществляет диспетчеризацию события событие, получателем которого является один из потомков объекта предок, до того как потомки получат уведомление о возникновении этого события.

Чтобы зарегистрировать приемник в предке получателя события для фазы всплытия диспетчеризации события, мы устанавливаем третьему параметру useCapture метода addEventListener ( ) значение false, как показано в следующем коде:

предок. addEventLi stener(событие, приемник, false)

В качестве альтернативы, поскольку в качестве значения по умолчанию параметра useCapture используется false, мы можем просто опустить аргумент useCapture, как показано в следующем коде:

предок. addEventLi stener(событие, приемник)

Приведенная строка кода заставляет метод приемник( ) выполняться всякий раз, когда среда Flash осуществляет диспетчеризацию события событие, получателем которого является один из потомков объекта предок, после того как потомки получат уведомление о возникновении этого события.

*«,

^ I Для краткости в оставшейся части этой главы мы будем использовать неофициальный м$ J* термин «приемник предка», который обозначает «приемник события, зарегистриро-—__За* ванный в отображаемом предке получателя события». Подобным образом, мы будем использовать термин «приемник получателя», который обозначает «приемник события, зарегистрированный непосредственно в получателе события».

Руководство по actionscript. часть 4, стр. 005

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

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

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

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

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

получательСобытия. addEventListener{событие, приемник, false) Или просто:

получательСобытия. addEventListener{событие, приемник)

Приведенная строка кода заставляет метод приемник( ) выполняться всякий раз, когда среда Flash выполняет диспетчеризацию события событие, получателем которого является объект получательСобытия, после того как предки объекта получательСобытия на фазе захвата получат уведомление о возникновении этого события.

* *.

Руководство по actionscript. часть 4, стр. 006

^ I При регистрации приемника события непосредственно в получателе события для уведом-

*S: л щ лений на фазе получения параметр useCapture должен быть всегда установлен в значение

*yj false или вообще опущен. В противном случае приемник никогда не будет вызван.

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

Регистрация приемника предка для фазы захвата

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

предок. addEventListener{событие, приемник, true)

Теперь используем этот код в работающем примере. Для тестовой иерархии отображения возьмем сценарий, который был изображен на рис. 21.1,— экземпляр класса Stage включает в себя объект Sprite, который, в свою очередь, содержит объект TextField. В листинге 21.1 представлен код для создания этой иерархии.

Листинг 21.1. Тестовая иерархия отображения

// Создаем экземпляр класса Sprite var theSprite:Sprite = new Sprite( );

// Создаем экземпляр класса TextField var theTextFi eld.-TextField = new TextField( ); theTextField. text = «enter input here»; theTextField. autoSize = TextFieldAutoSize. LEFT; theTextField. type = TextFieldType. INPUT;

// Добавляем объект TextField в объект Sprite theSprite. addChi1d(theTextFi eld);

// Добавляем объект Sprite в экземпляр класса Stage. Обратите внимание. // что объект некийОтображаемыйОбъект должен находиться в списке // отображения, чтобы иметь доступ к экземпляру класса Stage. некийОтображаемыйОбъект. stage. addChi1d(theSpri te);

Предположим, что мы хотим зарегистрировать функцию textlnputListener ( ) в объекте theSprite для событий TextEvent. TEXT_INPUT. Вот код функции textlnputListener ( ):

private function textlnputListener (e:TextEvent):void { traceCThe user entered some text»):

}

Мы хотим, чтобы функция textlnputListener ( ) вызывалась в фазе захвата (то есть до того, как объект TextField получит уведомление о возникновении события), поэтому для ее регистрации используем следующий код:

theSprite. addEventListener(TextEvent. TEXT_INPUT. textlnputListener. true)

Предыдущая строка кода заставляет функцию textlnputListener ( ) выполняться всякий раз, когда среда Flash осуществляет диспетчеризацию события TextEvent. TEXT_INPUT, получателем которого является объект theTextField, до того как объект theTextField получит уведомление о возникновении этого события.

Руководство по actionscript. часть 4, стр. 007

Регистрация приемника предка для фазы всплытия

Напомним, что для регистрации приемника предка для уведомлений о возникновения события в фазе всплытия мы устанавливаем параметру useCapture метода addEventListener ( ) значение false, как показано в следующем коде:

предок. addEventLi stener{событие, приемник, false)

Продолжая работу с нашим объектом TextField из листинга 21.1, предположим, что мы хотим зарегистрировать функцию textlnputListener ( ) в объекте

theSprite для событий TextEvent. TEXT_INPUT. При этом мы хотим, чтобы функция textlnputListener ( ) вызывалась в фазе всплытия (то есть после получения уведомления о возникновении события объектом TextField). Мы используем следующий код:

theSpri te. addEventLi stener(TextEvent. TEXT_INPUT. textInputLi stener. false)

Можно сделать то же самое, полностью опустив значение параметра useCapture:

theSprite. addEventListener(TextEvent. TEXT_INPUT. textlnputListener)

Эта строка кода заставляет функцию textlnputListener ( ) выполняться всегда, когда среда Flash осуществляет диспетчеризацию события TextEvent. TEXT_INPUT, получателем которого является объект theTextField, но после того, как объект theTextField получит уведомление о возникновении этого события.

Руководство по actionscript. часть 4, стр. 008

Обратите внимание, что, если бы событие TextEvent. TEXT_INPUT было не-всплывающим, функция textlnputListener ( ) никогда бы не была вызвана. Стоит еще раз повторить то, о чем мы узнали ранее: если приемник предка регистрируется для невсплывающего события либо с опущенным параметром useCapture, либо с параметром useCapture, которому установлено значение true, этот приемник никогда не будет вызван. Чтобы приемник предка вызывался при диспетчеризации невсплывающего события, он должен быть зарегистрирован для фазы захвата с параметром useCapture, которому установлено значение true.

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

? Обратиться к описанию события в справочнике по языку ActionScript корпорации Adobe.

? Обработать событие с помощью приемника события либо в фазе захвата, либо на фазе получения, и проверить значение переменной bubbles объекта Event, переданного в этот приемник. Если значение переменной bubbles равно true, событие является всплывающим; в противном случае — невсплы-вающим.

Следующий код демонстрирует последнюю методику:

// Регистрируем функцию clickListener( ) в экземпляре класса Stage // для событий MouseEvent. CLICK. Обратите внимание, что объект // некийОтображаемыйОбъект должен находиться в списке отображения. // чтобы иметь доступ к экземпляру класса Stage.

некийОтображаемыйОбъект. stage. addEventListener(MouseEvent. CLICK. clickListener);

// …далее в коде определяем функцию elickListener( ) private function clickListener (e:MouseEvent):void {

// Когда возникает событие, проверяем, является ли оно всплывающим

if (е. bubbles) { traceC’The MouseEvent. CLICK event is a bubbling event.»):

} else {

trace(«The MouseEvent. CLICK event is a non-bubbling event.»);

Для удобства поиска во всех разделах справочника по языку ActionScript корпорации Adobe, где описываются внутренние события, указано значение переменной экземпляра bubbles класса Event. Как правило, большинство внутренних событий, получателями которых являются отображаемые объекты, — всплывающие.

Руководство по actionscript. часть 4, стр. 009

Регистрация приемника предка для фазы захвата и фазы всплытия

Чтобы указать, что приемник предка должен вызываться и в фазе захвата, и в фазе всплытия (то есть до и после того, как получатель будет уведомлен о возникновении события), мы должны зарегистрировать этот приемник дважды — один раз параметр useCapture должно быть установлено значение true, а другой раз — значение false. Например, возвращаясь к нашему сценарию с объектом TextField, предположим, что мы хотим зарегистрировать наш приемник textlnputListener ( ) в объекте theSprite для событий TextEvent. TEXT_INPUT и чтобы функция textlnputListener ( ) вызывалась и в фазе захвата, и в фазе всплытия. Мы используем следующий код:

theSprite. addEventListener(TextEvent. TEXT_INPUT, textlnputListener, true) theSprite. addEventListener(TextEvent. TEXT_INPUT. textlnputListener, false)

I Если необходимо сделать так, чтобы приемник предка вызывался и в фазе захвата, л щ ив фазе всплытия процесса диспетчеризации события, он должен быть зарегистрирован Щ для этого события дважды.

Регистрация приемника в получателе события

Напомним, что для регистрации приемника получателя для фазы получения уведомления мы устанавливаем параметру useCapture метода addEventListener ( ) значение false, как показано в следующем коде:

получательСобытия. addEventListener(событие, приемник, false)

Таким образом, возвращаясь к нашему текущему сценарию с объектом TextField, чтобы зарегистрировать функцию textlnputListener ( ) вобъекте theTextField для событий TextEvent. TEXT_INPUT, мы используем следующий код:

theTextField. addEventListener(TextEvent. TEXT_INPUT.

Руководство по actionscript. часть 4, стр. 010

TextlnputListener, false)

Или просто:

theTextField. addEventListener(TextEvent. TEXT_INPUT, textlnputListener)

Приведенная строка кода заставляет функцию textlnputListener ( ) выполняться всякий раз, когда среда Flash осуществляет диспетчеризацию события TextEvent. TEXT_INPUT, получателем которого является объект theTextField. Функция textlnputListener ( ) выполняется после того, как экземпляр класса Stage и объект theSprite получат уведомления о возникновении события в фазе захвата, но до того, как экземпляр класса Stage и объект theSprite получат уведомления в фазе всплытия.

Двойное назначение параметра useCapture

Как было показано в двух предыдущих разделах, параметру useCapture метода addEventListener ( ) устанавливается значение false в двух различных ситуациях:

? когда регистрируемый приемник предка должен вызываться в фазе всплытия;

? когда регистрируемый приемник получателя должен вызываться в фазе получения.

Следовательно, когда при регистрации приемника для события параметр useCapture установлено значение false, этот приемник будет вызываться в процессе диспетчеризации события, если справедливо любое из следующих условий:

? получателем события является объект, в котором зарегистрирован приемник (в данном случае приемник вызывается в фазе получения);

? получателем события является потомок объекта, в котором зарегистрирован приемник (в данном случае приемник вызывается на фазе всплытия, после того как потомок обработает это событие).

Руководство по actionscript. часть 4, стр. 011

Например, следующий код регистрирует функцию clickListener ( ) в экземпляре класса Stage для событий MouseEvent. CLICK:

некийОтображаемыйОбъект. stage. addEventLi stener(MouseEvent. CLICK,

clickListener. false);

Поскольку параметру useCapture установлено значение false, функция clickListener ( ) будет вызываться в следующих ситуациях:

? когда пользователь щелкает кнопкой мыши в области отображения (в этом случае среда Flash выполняет диспетчеризацию события, получателем которого является экземпляр класса Stage);

? когда пользователь щелкает кнопкой мыши на любом отображаемом объекте, видимом на экране (в этом случае среда Flash выполняет диспетчеризацию события для объекта-получателя, на котором щелкнули кнопкой мыши, — данный объект всегда является потомком экземпляра класса Stage).

Обратите внимание, что, хотя функция clickListener( ) зарегистрирована в одном объекте (в экземпляре класса Stage), на этапе выполнения она может вызываться в процессе диспетчеризации событий, получателями которых является как данный объект, так и потомки данного объекта! По этой причине в некоторых случаях функция приемника должна включать код, игнорирующий процессы диспетчеризации событий, которые ее не интересуют. Мы рассмотрим код, необходимый для игнорирования процессов диспетчеризации событий, далее, в разд. «Отличие событий, получателем которых является некий объект, от событий, получателями которых являются его потомки».

Удаление приемников событий

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

зарегистрирован этот приемник изначально — в фазе захвата или в фазах получения или всплытия. Для этого мы используем третий параметр useCapture метода removeEventLi stener ( ), который полностью аналогичен параметру useCapture метода addEventListener ( ).

Руководство по actionscript. часть 4, стр. 012

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

^ I В случае отмены регистрации приемника значение параметра useCapture метода м$л* removeEventListener() должно всегда соответствовать значению, установленному для Яу параметра useCapture при исходном вызове метода addEventListener().

Например, в следующем коде мы регистрируем функцию clickListener ( ) в объекте некийОтображаемыйОбъект для фазы захвата, указывая в качестве параметра useCapture метода addEventListener ( ) значение true:

некийОтображаемыйОбъект. addEventListener(MouseEvent. CLICK.

clickListener, true):

Соответственно при отмене регистрации функции clickListener ( ) в объекте некийОтображаемыйОбъект мы должны указать значение true в качестве параметра useCapture метода removeEventListener ( ):

некийОтображаемыйОбъект. removeEventListener(MouseEvent. CLICK,

clickListener, true):

При отмене регистрации приемника события, который был дважды зарегистрирован в одном и том же объекте (для получения уведомлений как в фазе захвата, так и в фазах получения или всплытия), мы должны подобным образом дважды вызвать метод removeEventListener ( ). Например, следующий код дважды регистрирует приемник события MouseEvent. CLICK в экземпляре класса Stage, чтобы этот приемник вызывался и в фазе захвата, и в фазах получения или всплытия:

некийОтображаемыйОбъект. stage. addEventLi stener(MouseEvent. CLICK,

clickListener, true):

некийОтображаемыйОбъект. stage. addEventListener(MouseEvent. CLICK,

clickListener, false):

Следующий код удаляет два предыдущих приемника события Mous eEvent. CLIСК. Поскольку метод clickListener ( ) был зарегистрирован отдельно для фазы захвата и отдельно для фазы получения или всплытия, его регистрация должна также отменяться отдельно для каждой из этих фаз.



Полезные ссылки
Случайные записи
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 085
  • 13.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.96
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.86
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.63
  • 11.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.38
  • 09.03.2011">Руководство по actionscript. часть 4, стр. 052
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 023
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.6
  • 24.02.2011">Руководство по actionscript. часть 6, стр. 104
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 007
  • 11.11.2011">ColorReplacementTool
  • 01.03.2011">Руководство по actionscript. часть 5, стр. 126
  • 16.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.22
  • 23.08.2011">Британский ученый призывает запретить сливочное масло.
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.107
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...