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

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

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

Регистрация: Jun 2009
Сообщений: 64
По умолчанию Вызов removeEventListener в addEventListener

Подскажите, пожалуйста, должен ли верно работать следующий код:
Код AS3:
roomPanel.addEventListener(MouseEvent.CLICK, function(e) {
  // тут некий код
  roomPanel.removeEventListener(MouseEvent.CLICK, function (e) {});
});
или некий код нужно выносить в отдельную функцию, а removeEventListener нужно вызывать уже не из неё и с указанием имени этой функции?

Добавлено через 6 минут
Кстати, мой "некий код" вызывает другую функцию с передачей ей параметра (типа uint). Если создавать отдельную функцию (вместо function(e)), то как передать этой функции этот параметр? listener в addEventListener может содержать лишь имя функции, без параметров?

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

Регистрация: Dec 2005
Адрес: мухосранск
Сообщений: 661
Отправить сообщение для divinus с помощью ICQ
LA_, говорилось уже миллион раз, даже отвечать не хочется... ну не используйте вы такой способ определения обработчиков, ну не правильно это...
__________________
Кто может делать - делает, кто не может делать - учит, кто не может учить - управляет...

Старый 04.08.2009, 16:36
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 3  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
некий код нужно выносить в отдельную функцию, а removeEventListener нужно вызывать уже не из неё и с указанием имени этой функции ссылки на эту функцию
в твоем же варианте функции в addEventListener и в removeEventListener это два разных объекта, и отписаться так не получится

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

тема эта тут уже до дыр обсуждена, посмотри по форуму

Старый 04.08.2009, 16:41
LA_ вне форума Посмотреть профиль Отправить личное сообщение для LA_ Найти все сообщения от LA_
  № 4  
Ответить с цитированием
LA_

Регистрация: Jun 2009
Сообщений: 64
ок. нашел кое-чего тут на эту тему.

но тогда все-таки остался вопрос с передачей параметра этой функции. не делать же это через глобальные переменные..

Старый 04.08.2009, 17:00
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
1) этой функции уже передается параметр (Event), все что нужно должно быть 'на борту' этого параметра, см. класс Event и его наследников - у этих объектов и так довольно много полезных свойств, но ничто не мешает добавить новые, создав своего наследника Event и передавать его.., но это как бы самый общий случай

в случае с мышиными событиями часто достаточно просто знать какой объект явился источником события (см. Event#target, Event#currentTarget), нужный параметр тогда берем из свойств самого объекта или из Dictionary по ссылке на этот объект

2) можно

Старый 04.08.2009, 17:21
LA_ вне форума Посмотреть профиль Отправить личное сообщение для LA_ Найти все сообщения от LA_
  № 6  
Ответить с цитированием
LA_

Регистрация: Jun 2009
Сообщений: 64
silin, идея понятна. есть ли где-нить пример как это делается?
я делаю следующее: считываю данные с сервера (=узнаю значения 4-х переменных), отображаю панель, которая содержит четыре кнопки. при нажатии на кнопку 1 выполняется функция с полученным ранее значением переменной 1, при нажатии на кнопку 2 - переменной 2 и т.д.
(пока переменных и кнопок - четыре, но в будущем может быть больше, потому нужен универсальный код).

Старый 04.08.2009, 17:45
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 7  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Код AS3:
public class Main extends Sprite 
{
	private var _buttonsMap:Dictionary = new Dictionary();
 
	public function Main():void 
	{
		for (var i:int = 0; i < 4; i++) 
		{
			var but:Sprite = new Sprite();
			but.x = i * 50;
			but.graphics.beginFill(0);
			but.graphics.drawRect(0, 0, 30, 30);
			but.addEventListener(MouseEvent.CLICK, butClickHandler);
			_buttonsMap[but] = i;//какие-то данные
			addChild(but);
		}
	}
 
 
	private function butClickHandler(event:MouseEvent):void 
	{
		var but:Sprite = event.target as Sprite;
		but.removeEventListener(MouseEvent.CLICK, butClickHandler);
		var id:int = _buttonsMap[but];
 
		trace( "id : " + id );//эти же данные по клику
	}
 
}

Старый 04.08.2009, 18:18
catyoshi вне форума Посмотреть профиль Отправить личное сообщение для catyoshi Найти все сообщения от catyoshi
  № 8  
Ответить с цитированием
catyoshi

Регистрация: Feb 2006
Сообщений: 56
Отправить сообщение для catyoshi с помощью ICQ
2 LA: на сколько я знаю во флеше анонимные функции есть и работают хорошо. ниже пример. но я согласен, с людьми, что это зачастую плохая практика. хотя порой и удобная. лучше вместо анонимной функции передаать ссылку на некий метод

Код AS3:
roomPanel.addEventListener( MouseEvent.CLICK, function ( event:MouseEvent ):void { /* some code here */ event.target.removeEventListener( event.type, arguments.callee ); } );


Последний раз редактировалось catyoshi; 04.08.2009 в 18:20.
Старый 04.08.2009, 18:37
LA_ вне форума Посмотреть профиль Отправить личное сообщение для LA_ Найти все сообщения от LA_
  № 9  
Ответить с цитированием
LA_

Регистрация: Jun 2009
Сообщений: 64
поменял
Код AS3:
var but:Sprite = event.target as Sprite;
на
Код AS1/AS2:
var but:Sprite = event.currentTarget as Sprite;
заработало как надо. спасибо!

Старый 15.02.2010, 00:31
vasya87 вне форума Посмотреть профиль Отправить личное сообщение для vasya87 Найти все сообщения от vasya87
  № 10  
Ответить с цитированием
vasya87
 
Аватар для vasya87

Регистрация: Jan 2010
Адрес: Кривой Рог
Сообщений: 117
возвращаясь к первому посту
а всё же интересно, а если дать функции имя
Код AS3:
roomPanel.addEventListener(MouseEvent.CLICK, function(e) someFunction {
  // тут некий код
  roomPanel.removeEventListener(MouseEvent.CLICK, someFunction);
});
такой код будет работать?

Добавлено через 9 минут
таки работает(:
Код AS3:
roomPanel.addEventListener(MouseEvent.CLICK, function(e) someFunction {
  // тут некий код
  trace(roomPanel.hasEventListener(MouseEvent.CLICK)+' ');
  roomPanel.removeEventListener(MouseEvent.CLICK, someFunction);
  trace(roomPanel.hasEventListener(MouseEvent.CLICK));
});
на выходе: true false

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

Теги
addeventlistener , removeEventListener
Опции темы
Опции просмотра

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

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


 


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


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