ОК, так что, если вы уже знаете это уже, мои извинения ... но это кажется довольно распространенной проблемой и не сразу очевидна.
В событиях AS3, отправленных объектами в списке отображения, можно прослушать так, как они пузыряют до иерархию списка отображения, не указывая исходный объект. (Предполагая, конечно, что событие имеет свойство барботирования, равное true). Следовательно, класс документов (старая концепция _root) может реагировать на щелчки мыши с любого экранного объекта, независимо от того, насколько глубоко он вложен, с
addEventListener(MouseEvent.CLICK, _onMouseClick)
В любой другой ситуации - например, для барботажа установлено значение false, вещатель не является InteractiveObject в списке отображения или (как в вашем случае), слушатель ниже, чем вещатель в иерархии списка отображения - объект, вещающий событие, должен быть специально прослушен:
fooInstance.addEventListener(Event.BAR, _bazFunc)
as против
addEventListener(Event.BAR, _bazFunc)
В основном вам необходимо передать ссылку на родительский объект на дочерний swf, чтобы он мог присоединить к нему обработчики событий.
Один из способов - отправить событие от ребенка родительскому классу через список отображения (после того, как ребенок загрузился и полностью инициализирован). Родитель использует свойство event.target этого события для ссылки на дочерний элемент и устанавливает для него переменную parentClass. Это может быть использовано для прикрепления слушателей:
package {
class ChildClass
{
private var __parentClass:ParentClass;
// EventID to listen for in ParentClass
public static const INITIALISED:String = "childInitialised";
// Constructor
function ChildClass()
{
// Do initialising stuff, then call:
_onInitialised();
}
private function _onInitialised():void
{
// Dispatch event via display hierarchy
// ParentClass instance listens for generic events of this type
// e.g. in ParentClass:
// addEventListener(ChildClass.INITIALISED, _onChildInitialised);
// function _onChildInitialised(event:Event):void {
// event.target.parentClass = this;
// }
// @see mutator method "set parentClass" below
dispatchEvent(new Event(ChildClass.INITIALISED, true);
}
public function set parentClass(value:ParentClass):void
{
__parentClass = value;
// Listen for the events you need to respond to
__parentClass.addEventListener(ParentClass.FOO, _onParentFoo, false, 0, true);
__parentClass.addEventListener(ParentClass.BAR, _onParentBar, false, 0, true);
}
private function _onParentFoo(event:Event):void
{
...
}
}
}
Диспетчерская пользовательского ChildSWFEvent - то есть вместо того, чтобы использовать класс определенный постоянный, как и выше - сделает это более гибкое решение, так как экземпляр ParentClass может прослушивать общей ChildSWFEvent .INITIALISED событие, переданное любым дочерним swf с контекстно-полезной информацией, переданной в качестве дополнительного параметра.
Очень приятно, легко и просто. Благодаря! – cregox