![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
1) Новая событийная модель не может не радовать
Однако, "пузырьковость" евентовых объектов, заставляет сменить AS 2.0 тактику написания обработчиков ивентов, а именно, если говорить простыми словами, раньше target был один, а теперь их целая последовательность. Возникает вопрос, как грамотно обработать ивент, только для нужного нам объекта (на ум пока приходит только проверка типов для event.target и event.currentTarget, что выглядит довольно коряво (см.пример))?2) Плюс, столкнулся с проблемой для mx.containers.TitleWindow (хочу задачть обрабочика на клик по клоузбаттону) - ивент click (Events inherited from class Panel) . Проблема в том, что аналогичный ивент генерится и просто при клике на инстанс TitleWindow - ивент click (Events inherited from class UIComponent). Как отличить два случая? В примере окошко закрывается не только в случае клика по кнопке close, но и при клике на титл окна. Вот код по обоим примерам: package classes.ui {
public class ImageWindow extends TitleWindow {
public function ImageWindow(){
className = "ImageWindow";
}
override public function initialize():Void{
super.initialize();
addEventListener(MouseEventType.CLICK, onClick);
}
private function onClick(event:MouseEvent):Void{
if((event.currentTarget is ImageWindow)){
if(event.target is ImageWindow){
WindowManager.closePopUp(event, event.currentTarget);
}else{
WindowManager.riseWindow(event, event.currentTarget);
}
}
}
}
}
|
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
а почему таргетов целая последовательность? таргет при клике только один.
ну отследи фазу capture.... event.eventPhase == 1 посмотри кто таргет, если таргет клосбатон - то выполняй свое действие и отменяй распостранение эвента, или не отменяй. |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
хотя как бы фазу capture отслеживать и незачем.. ведь отдельный обработчик для этого....
|
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
кстати я не совсем понимаю назначение currentTarget.... может пояснишь,
я трейсю при клике у меня всегда таргет Stage.... я тестирую просто на спрайтах, может в компонентах по другому, как я понял currentTarget - это верхний в иерархии объект, от которого начинается распостраниение фазы capture и заканчивается фаза bubble... или по другому как? Последний раз редактировалось john; 26.12.2005 в 17:22. |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
о! какой Stage. я ведь к Stage добавил обработчик события,
теперь понял для чего currentTarget.... |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
currentTarget нужен тогда когда один и тот же обработчик (метод/функия) используется несколько раз при обработки события,
например при обработки capture фазы я добавил обработчик руту и вложненному в него спрайту, мне нужно узнать где, в каком контексте обрабатывается событие, чей addEventListener был использован при регистрации хендлера. но target все равно будет один. |
|
|||||
|
Хм, видим ос компонентами все сложнее. Пример для mx.containers.TitleWindow:
private function onClick(event:MouseEvent):Void{
trace("-----");
trace(event.target);
}
//output:
-----
ImageWindow_22
ImageWindow_22.UIComponent_23.Button_26
-----
[object Loader]
Т.е. кроме инстанса TitleWindow так же подписываются еще куча обектов и для всех них дергается один и тот же метод с разными таргетами. |
|
|||||
|
Вот более полный лог (условия те же):
----- target = [object Loader], currentTarget=ImageWindow_22 ----- target = ImageWindow_22, currentTarget=ImageWindow_22 ----- target = ImageWindow_22.UIComponent_23.Button_26, currentTarget=ImageWindow_22 И все-таки по теме сабжа, выходит if'ы лепить - единсвенный метод буть уверенным, что target - нужный тебе обект (пока работаю с флексом вторым, так что говорю только о компонентах, со спрайтами особо не возился, судя по постам Джона там дела обстоят иначе ) ? |
|
|||||
|
МЕГАФЛЭШЕР
Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
|
чтото не понимаю я вопроса/задачи....
ну кликнул на элемент - он и таргет получается, или чтото не так? давай с постановки задачи, что нужно добиться? какие симптомы проблемы? и полный пример в студию.... Последний раз редактировалось john; 26.12.2005 в 20:09. |
|
|||||
|
В общем так:
Задача - закрыть окошко по клику на клозбатон (клозбатон встроеный, прямой ссылки на себя не имеет. В мане написано, что TitleWindow генерит click, когда кликают на клозбатон - собсвенный ивент класса TitleWindow). Имеем - одно окно (см код из головного поста). На него вешается один раз обработчик (в initialize) - все, больше никаких обработчиков нигде нет. (Тут имеется подводный камень: TitleWindow имеет унаследованный от UIComponent ивент click ! (вот надо ж было девелоперам из ММ назвать 2 РАЗНЫХ ивента одинакого) - этот ивент дергается, когда мы кликаем на любое место TitleWindow, таким образом при клике на клозбатон обработчик дергается дважды). Получаем: В обработчике получаем кашу из target'ов.. При клике на склозбатом таргктом является она, при клике на контен TitleWindow (там у нас лежит Image отнаследованный от Loader) таргетом является Loader, а при клике на чисто TitleWindow таргетом является сам TitleWindow, а currentTarget всегда один -TitleWindow, имхо это расходится с тем, что ты писал, Джон? Таким образом главная проблема - как отловить нажание именно на клозбатон? Прямой ссылки мы на его инстанс не имеем, чтобы сделать проверку на равенство target и клозбатона, а проверка по типу (Button) ни к чему не ведет, т.к. в теле окна, может быть куча других баттонов. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:31. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|