Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 10.07.2010, 15:17
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 1  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
По умолчанию дважды обработать событие

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

ЗЫ. можно было бы через parent, но хотелось бы с соблюдением ООП-шности...
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 10.07.2010, 15:54
Jewelz вне форума Посмотреть профиль Отправить личное сообщение для Jewelz Найти все сообщения от Jewelz
  № 2  
Ответить с цитированием
Jewelz
 
Аватар для Jewelz

Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
Чтобы прослушивать событие во всех трех фазах, необходимо вызвать addEventListener дважды: один раз с useCapture в значении true, а другой — с useCapture в значении false.
__________________
low +

Старый 10.07.2010, 16:08
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 3  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
У меня такая примерно иерархия: 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 и объект последнего уровня, но не тот, который находится между ними. Что я делаю не правильно, как мне в событиии до него достучаться, имея события только на контейнере? Вешать непосредственно на этот объект не хочу, т.к. подобных может быть бесконечно большое количество.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!


Последний раз редактировалось TanaTiX; 10.07.2010 в 16:35.
Старый 13.07.2010, 19:48
himmens вне форума Посмотреть профиль Отправить личное сообщение для himmens Найти все сообщения от himmens
  № 4  
Ответить с цитированием
himmens

Регистрация: Jun 2010
Адрес: Москва
Сообщений: 8
Не понял, для чего вы подписываетесь по 3 раза с разным приоритетом? Событие все равно придет один раз для данной фазы.

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

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

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

Старый 15.07.2010, 04:16
Elser вне форума Посмотреть профиль Отправить личное сообщение для Elser Найти все сообщения от Elser
  № 5  
Ответить с цитированием
Elser
 
Аватар для Elser

Регистрация: Feb 2009
Адрес: Ялта, Севастополь, Одесса
Сообщений: 52
всем объектам поприсваивайте name для идентификации и затем
Код AS3:
private function onDown(event:MouseEvent = null):void{
    trace('target:'         +event.target.name+
          ', currentTarget:'+event.currentTarget.name+
          ', eventPhase:'   +event.eventPhase);
}
для меня это оказался самый простой способ въехать в фазы событий
там на самом деле все очень просто
__________________
понимание основ освобождает от необходимости запоминания тысяч фактов


Последний раз редактировалось Elser; 15.07.2010 в 04:22.
Старый 15.07.2010, 23:51
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 6  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Код:
Не понял, для чего вы подписываетесь по 3 раза с разным приоритетом
Протупил - перепутал параметр.
Спасбо, за отзывы, задача решена другим способом. Судя по всему изначально был выбран неправильный подход к формированию структуры.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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