Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   дважды обработать событие (http://www.flasher.ru/forum/showthread.php?t=142018)

TanaTiX 10.07.2010 15:17

дважды обработать событие
 
Есть некоторый контейнер, в котором находятся другие объекты, в которых в свою очередь могут находиться другие объекты. На контейнере есть мышиное событие mouseDown.
Задача: если мы кликаем по объекту, который не содержит других вложенных объектов в месте клика, то событие у нас вызывается один раз, а если мы к примеру попадаем по объекту, который находится в одном из объектов, который расположен в контейнере (м-дя, завернул...), то необходимо получить 2 событие с e.target в одном случае в виде самого объекта, а в другом - в виде того объекта, который находится в последнем.
Знаю, что дело в фазах события, но что-то не получается сообразить как это реализовать. Заранее спасибо.

ЗЫ. можно было бы через parent, но хотелось бы с соблюдением ООП-шности...

Jewelz 10.07.2010 15:54

Чтобы прослушивать событие во всех трех фазах, необходимо вызвать addEventListener дважды: один раз с useCapture в значении true, а другой — с useCapture в значении false.

TanaTiX 10.07.2010 16:08

У меня такая примерно иерархия: container(на нем слушатели)-объект(контейнер для вложенных объектов)-объекты последнего уровня(теоретически могут быть контейнерами, но на данный момент - нет)
Код AS3:

addEventListener(MouseEvent.MOUSE_DOWN, onDown, false, 0, true);
addEventListener(MouseEvent.MOUSE_DOWN, onDown, false, 1, true);
addEventListener(MouseEvent.MOUSE_DOWN, onDown, false, 2, true);
 
addEventListener(MouseEvent.MOUSE_DOWN, onDown, true, 0, true);
addEventListener(MouseEvent.MOUSE_DOWN, onDown, true, 1, true);
addEventListener(MouseEvent.MOUSE_DOWN, onDown, true, 2, true);

вот повесил слушатели во всех возможных вариантах (чтоб наверняка:) ).
При этом отслеживаю e.target и e.currentTarget. В трйсе выводится container и объект последнего уровня, но не тот, который находится между ними. Что я делаю не правильно, как мне в событиии до него достучаться, имея события только на контейнере? Вешать непосредственно на этот объект не хочу, т.к. подобных может быть бесконечно большое количество.

himmens 13.07.2010 19:48

Не понял, для чего вы подписываетесь по 3 раза с разным приоритетом? Событие все равно придет один раз для данной фазы.

event.currentTarget - тот кого слушаем, то есть всегда ваш container.
event.target - тот кто инициировал событие в цепочке списка отображения.

Итого, если в container лежит еще container2, а в нем object, то при клике на object - в событии получим event.target == object. Тут все нормально и ошибки тут нет.

То что вы описали сделать не получится, да и непонятно зачем? Если пришло событие от ребенка, всегда можно узнать есть ли у него родитель и является ли он родителем верхнего уровня.

Elser 15.07.2010 04:16

всем объектам поприсваивайте name для идентификации и затем
Код AS3:

private function onDown(event:MouseEvent = null):void{
    trace('target:'        +event.target.name+
          ', currentTarget:'+event.currentTarget.name+
          ', eventPhase:'  +event.eventPhase);
}

для меня это оказался самый простой способ въехать в фазы событий
там на самом деле все очень просто

TanaTiX 15.07.2010 23:51

Код:

Не понял, для чего вы подписываетесь по 3 раза с разным приоритетом
Протупил - перепутал параметр.
Спасбо, за отзывы, задача решена другим способом. Судя по всему изначально был выбран неправильный подход к формированию структуры.


Часовой пояс GMT +4, время: 22:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.