Наконец-то сел почитать, чтобы разобраться с Событиями досканально - многое прояснил для себя.
Но есть момент, в котором не знаю как правильно поступить: как раз столкнулся на моем примере, когда по совету от
caseyryan стал не создавать свое новое событие, а передиспатчивать существующее - dispatchEvent(e).
Мне нужно ловить событие клика по спрайту _box, который внутри класса ImageBox.
Код AS3:
public class ImageBox extends Sprite
{
private var _box:Sprite; // в этом спрайте рисуется бэкграунд и грузится картинка
private var _cb:CheckBox; // чекбокс
public function ImageBox()
{
_box = new Sprite();
_box.addEventListener(MouseEvent.CLICK, onClickHandler);
addChild(_box);
_cb = new CheckBox();
addChild(_cb);
}
private function onClickHandler(e:MouseEvent):void
{
dispatchEvent(e);
}
}
Код AS3:
_imageBox = new ImageBox();
_imageBox.addEventListener(MouseEvent.CLICK, onClick);
addChild(_imageBox);
private function onClick(e:MouseEvent):void
{
trace(e.target); // выводит [object ImageBox] и [object Sprite]
}
В итоге обработчик onClick срабатывает два раза.
Как я понимаю:
ImageBox имеет событие click, унаследовав от Sprite. И _box тоже. Подписавшись на событие click у _imageBox - из-за цепочки событий в иерархии отображаемых объектов на фазе захвата происходит диспатч сначала у предка [object ImageBox], а потом и у получателя [object Sprite].
Верно ли понимаю?
Вопрос: мне не нужно чтобы onClick срабатывал дважды, т.к. в нем будут производиться какие-либо действия дважды.. Вижу два выхода: 1) в обработчике проверять от кого пришло событие и только после этого выполнять дальнейшие действия. 2) либо все таки в onClickHandler диспатчить свое событие.
Подскажите пожалуйста.