Руководство по actionscript. часть 3, стр. 141
События Event. ADDED и Event. REMOVED
После того как новый дочерний отображаемый объект добавляется в объект DisplayObjectContainer, среда Flash выполняет диспетчеризацию события Event. ADDED, получателем которого является новый дочерний объект. Подобным образом, когда существующий дочерний отображаемый объект удаляется из объекта DisplayOb j ectContainer, среда Flash выполняет диспетчеризацию события Event. REMOVED, получателем которого является удаленный дочерний объект.
Как будет рассмотрено в гл. 21, когда при диспетчеризации получателем события является объект в иерархии отображения, уведомление об этом событии получают данный объект и все его предки. Следовательно, когда возникает событие Event. ADDED, уведомление о добавленном дочернем объекте получают сам объект, его новый родительский контейнер и все предки данного контейнера. Подобным образом, когда возникает событие Event. REMOVED, уведомление об удаленном дочернем объекте получают сам объект, его старый родительский контейнер и все предки данного контейнера. Таким образом, события Event. ADDED и Event. REMOVED могут использоваться двумя различными способами:
? экземпляр класса DisplayOb j ectContainer может использовать эти события, чтобы определить, когда у него появляется или теряется отображаемый потомок;
? экземпляр класса Di spl а у Ob j ect может использовать данные события, чтобы определить, когда он будет добавлен в родительский контейнер или удален из него.
Рассмотрим обобщенный код, который демонстрирует описанные сценарии, начиная с контейнера, определяющего факт появления нового потомка.
Сначала мы создадим два объекта Sprite: один из них будет играть роль контейнера, а другой — дочернего объекта:
var container:Sprite = new Sprite( ); var child:Sprite = new Sprite( ):
Теперь мы создадим метод-приемник addedLi stener ( ), который будет регистрироваться в объекте container для получения событий Event. ADDED:
private function addedListener (e:Event):void { trace(«Added was triggered»):
}
После этого мы регистрируем метод addedLi stener ( ) в объекте container: contai пег. addEventLi stener(Event. ADDED, addedLi stener); Наконец, мы добавляем объект child в объект container: contai пег. addChi1d(chi1d);
При выполнении предыдущего кода среда Flash выполняет диспетчеризацию события Event. ADDED, получателем которого является объект child. В результате, поскольку объект container является отображаемым предком объекта child, на фазе всплытия события будет вызвана функция addedLi stener ( ), зарегистрированная в объекте container (дополнительную информацию по фазе всплытия можно найти в гл. 21).
I Когда событие Event. ADDED вызывает приемник события на фазе захвата или всплы-& d т тия’ МЬ| знаем/ что У объекта, в котором зарегистрирован приемник, появился новый -^-3?«4 отображаемый потомок.
Теперь добавим новый дочерний объект в объект child, превратив container в гордого прародителя:
var grandchild:Sprite = new Sprite( ); chi1d. addChi1d(grandchiId);
При выполнении предыдущего кода среда Flash снова осуществляет диспетчеризацию события Event. ADDED, получателем которого на этот раз является объект grandchild, и на фазе всплытия вновь вызывается метод addedLi stener ( ). Поскольку приемник вызван на фазе всплытия, мы знаем, что у объекта container появился новый потомок, но не уверены, является ли этот потомок непосредственным ребенком объекта container. Чтобы определить это, мы проверяем, совпадает ли значение переменной parent объекта child с объектом container, как показано в следующем коде:
private function addedListener (e:Event):void { // Помните, что переменная Event. currentTarget ссылается на объект, // в котором зарегистрирован выполняемый в настоящий момент приемник, -// в данном случае, на объект container. Помните также, что переменная // Event. target ссылается на получатель события, в данном случае -// на объект grandchild.