Поток событий

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

Flash Player или AIR отправляет объекты событий при каждом появлении события. Если цель события не внесена в список отображения, Flash Player или AIR отправляет объект события напрямую к цели события. Например, Flash Player отправляет объект события хода выполнения напрямую в объект URLStream. Однако если цель события внесена в список отображения, Flash Player отправляет объект события в список отображения, и этот объект проходит по списку отображения к цели события.

Поток событий описывает перемещение объекта события в списке отображения. Список отображения организован как иерархия, которую можно описать в виде дерева. В верхней части иерархии списка отображения находится рабочая область, которая является особым контейнером экранного объекта, выступающим в роли корня списка отображения. Рабочая область представлена классом flash.display.Stage. Она вызывается только с помощью экранного объекта. Каждый экранный объект имеет свойство stage , которое относится к рабочей области приложения.

Когда Flash Player или AIR отправляет объект события для события, относящегося к списку отображения, этот объект события появляется в рабочей области и возвращается к узлу цели . Спецификация событий DOM определяет узел цели как узел, представляющий цель события. Иными словами, целью события является объект списка отображения, в котором произошло событие. Например, если пользователь щелкнет объект списка отображения с именем child1 , Flash Player или AIR отправит объект события, указав в качестве узла цели child1 .

Поток событий на понятийном уровне делится на три части. Первая фаза называется фазой захвата; эта фаза включает в себя все узлы от рабочей области до родительского узла узла цели. Вторая часть называется фазой цели, которая состоит исключительно из целевого узла. Третья часть называется фазой восходящей маршрутизации. Фаза восходящей маршрутизации включает в себя узлы, встреченные на обратном пути от родительского узла узла цели к рабочей области.

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

Если пользователь нажимает Child1 Node , Flash Player или AIR отправляет объект события в поток событий. Как указано на следующем изображении, объект начинает движение с рабочей области Stage , перемещается вниз к родительскому узлу Parent Node , затем к дочернему узлу Child1 и, наконец, перемещается вверх обратно в рабочую область Stage , снова проходя через родительский узел Parent Node на пути к рабочей области Stage .

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

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

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

Однако не всякий объект события участвует во всех трех фазах потока событий. Некоторые типы событий (например, типы событий enterFrame и init ) отправляются напрямую в узел цели и не участвуют ни в фазе захвата, ни в фазе восходящей маршрутизации. Другие события могут иметь в качестве цели объекты, которые не входят в список отображения (например, события, отправленные экземпляру класса Socket). Эти объекты событий будут также напрямую поступать в объект цели, не участвуя в фазах захвата и восходящей маршрутизации.

Чтобы выяснить, как ведет себя тот или иной тип события, можно либо проверить документацию API, либо изучить свойства объекта события. Изучение свойств объекта события описано в следующем разделе.