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

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

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

Регистрация: Jun 2004
Адрес: Moscow
Сообщений: 51
Отправить сообщение для FSBmipt с помощью ICQ
По умолчанию правильно пишем метод-обработчик события

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);
				}
			}
		}
	}
}

Старый 26.12.2005, 16:37
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 2  
Ответить с цитированием
john
МЕГАФЛЭШЕР

Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
а почему таргетов целая последовательность? таргет при клике только один.

ну отследи фазу capture....
event.eventPhase == 1
посмотри кто таргет,
если таргет клосбатон - то выполняй свое действие и отменяй распостранение эвента, или не отменяй.

Старый 26.12.2005, 16:42
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 3  
Ответить с цитированием
john
МЕГАФЛЭШЕР

Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
хотя как бы фазу capture отслеживать и незачем.. ведь отдельный обработчик для этого....

Старый 26.12.2005, 17:19
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 4  
Ответить с цитированием
john
МЕГАФЛЭШЕР

Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
кстати я не совсем понимаю назначение currentTarget.... может пояснишь,
я трейсю при клике у меня всегда таргет Stage.... я тестирую просто на спрайтах, может в компонентах по другому,
как я понял currentTarget - это верхний в иерархии объект, от которого начинается распостраниение фазы capture и заканчивается фаза bubble... или по другому как?


Последний раз редактировалось john; 26.12.2005 в 17:22.
Старый 26.12.2005, 17:37
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 5  
Ответить с цитированием
john
МЕГАФЛЭШЕР

Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
о! какой Stage. я ведь к Stage добавил обработчик события,
теперь понял для чего currentTarget....

Старый 26.12.2005, 17:41
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 6  
Ответить с цитированием
john
МЕГАФЛЭШЕР

Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
currentTarget нужен тогда когда один и тот же обработчик (метод/функия) используется несколько раз при обработки события,
например при обработки capture фазы я добавил обработчик руту и вложненному в него спрайту,
мне нужно узнать где, в каком контексте обрабатывается событие, чей addEventListener был использован при регистрации хендлера.

но target все равно будет один.

Старый 26.12.2005, 19:06
FSBmipt вне форума Посмотреть профиль Отправить личное сообщение для FSBmipt Посетить домашнюю страницу FSBmipt Найти все сообщения от FSBmipt
  № 7  
Ответить с цитированием
FSBmipt
 
Аватар для FSBmipt

Регистрация: Jun 2004
Адрес: Moscow
Сообщений: 51
Отправить сообщение для FSBmipt с помощью ICQ
По умолчанию re

Хм, видим ос компонентами все сложнее. Пример для mx.containers.TitleWindow:

Код:
		private function onClick(event:MouseEvent):Void{
			trace("-----");
			trace(event.target);
		}
//output:
-----
ImageWindow_22
ImageWindow_22.UIComponent_23.Button_26
-----
[object Loader]
В первом случае кликал на клозбатон, во-втором на тело окошка (в теле Image (отнаследованный от Loader), хотя на него я никаких обработчиков не вешал).
Т.е. кроме инстанса TitleWindow так же подписываются еще куча обектов и для всех них дергается один и тот же метод с разными таргетами.

Старый 26.12.2005, 19:30
FSBmipt вне форума Посмотреть профиль Отправить личное сообщение для FSBmipt Посетить домашнюю страницу FSBmipt Найти все сообщения от FSBmipt
  № 8  
Ответить с цитированием
FSBmipt
 
Аватар для FSBmipt

Регистрация: Jun 2004
Адрес: Moscow
Сообщений: 51
Отправить сообщение для FSBmipt с помощью ICQ
Вот более полный лог (условия те же):

Код:
-----
target = [object Loader], currentTarget=ImageWindow_22
-----
target = ImageWindow_22, currentTarget=ImageWindow_22
-----
target = ImageWindow_22.UIComponent_23.Button_26, currentTarget=ImageWindow_22
Т.е. currentTarget всегда один (тот на кого я повеси обработчик), а вот target разные (объект, по которому я кляцаю).
И все-таки по теме сабжа, выходит if'ы лепить - единсвенный метод буть уверенным, что target - нужный тебе обект (пока работаю с флексом вторым, так что говорю только о компонентах, со спрайтами особо не возился, судя по постам Джона там дела обстоят иначе ) ?

Старый 26.12.2005, 20:06
john вне форума Посмотреть профиль Отправить личное сообщение для john Посетить домашнюю страницу john Найти все сообщения от john
  № 9  
Ответить с цитированием
john
МЕГАФЛЭШЕР

Регистрация: May 1999
Адрес: Россия, Москва
Сообщений: 1,181
чтото не понимаю я вопроса/задачи....
ну кликнул на элемент - он и таргет получается, или чтото не так?

давай с постановки задачи, что нужно добиться?
какие симптомы проблемы?
и полный пример в студию....


Последний раз редактировалось john; 26.12.2005 в 20:09.
Старый 26.12.2005, 20:21
FSBmipt вне форума Посмотреть профиль Отправить личное сообщение для FSBmipt Посетить домашнюю страницу FSBmipt Найти все сообщения от FSBmipt
  № 10  
Ответить с цитированием
FSBmipt
 
Аватар для FSBmipt

Регистрация: Jun 2004
Адрес: Moscow
Сообщений: 51
Отправить сообщение для FSBmipt с помощью ICQ
По умолчанию ре

В общем так:
Задача - закрыть окошко по клику на клозбатон (клозбатон встроеный, прямой ссылки на себя не имеет. В мане написано, что TitleWindow генерит click, когда кликают на клозбатон - собсвенный ивент класса TitleWindow).

Имеем - одно окно (см код из головного поста). На него вешается один раз обработчик (в initialize) - все, больше никаких обработчиков нигде нет. (Тут имеется подводный камень: TitleWindow имеет унаследованный от UIComponent ивент click ! (вот надо ж было девелоперам из ММ назвать 2 РАЗНЫХ ивента одинакого) - этот ивент дергается, когда мы кликаем на любое место TitleWindow, таким образом при клике на клозбатон обработчик дергается дважды).

Получаем: В обработчике получаем кашу из target'ов.. При клике на склозбатом таргктом является она, при клике на контен TitleWindow (там у нас лежит Image отнаследованный от Loader) таргетом является Loader, а при клике на чисто TitleWindow таргетом является сам TitleWindow, а currentTarget всегда один -TitleWindow, имхо это расходится с тем, что ты писал, Джон?

Таким образом главная проблема - как отловить нажание именно на клозбатон? Прямой ссылки мы на его инстанс не имеем, чтобы сделать проверку на равенство target и клозбатона, а проверка по типу (Button) ни к чему не ведет, т.к. в теле окна, может быть куча других баттонов.

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

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

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


 


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


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