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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.10.2010, 17:40
inozemcev вне форума Посмотреть профиль Отправить личное сообщение для inozemcev Найти все сообщения от inozemcev
  № 1  
Ответить с цитированием
inozemcev
[+ 1.0 08.10.14]
 
Аватар для inozemcev

блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
По умолчанию displayObject removeAllListeners

Требуется написать универсальную функцию, которая отписывает объект от каких либо оповещений. Можно ли это сделать каким то стандартным образом. Быть может есть какой то список с событиями, на который подписался объект. Или придется тупо спрашивать его о листенерах через hasEventListener ?!

Старый 30.10.2010, 17:55
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 2  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
hasEventListener бесполезен, он только скажет, что обработчик есть.
В отписке нужно указывать не только тип, но и обработчик события, а для всплывающих ещё и флаг перехвата.
Список есть, но доступа к нему нет

Нативных решений нет но есть различные менеджеры событий, работающие через наследование, композицию или как глобальные.

Старый 30.10.2010, 18:17
inozemcev вне форума Посмотреть профиль Отправить личное сообщение для inozemcev Найти все сообщения от inozemcev
  № 3  
Ответить с цитированием
inozemcev
[+ 1.0 08.10.14]
 
Аватар для inozemcev

блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
Есть такая функция describeType, которая возвращает xml описание объекта. Я ее использовал, чтобы обходить свойства экземпляров классов, потому, что не все экземпляры можно обойти с помощью цикла for. Может быть в нем есть этот лист ?

Добавлено через 1 час 26 минут
Вообщем с помощью метода flash.sampler.getMemberNames удалось добраться до массива с листенерами:

Код AS3:
public static function removeAllListeners (object:Object) :void
{
	var members:Object = getMemberNames(object);
	for each (var prop:QName in members)
	{
		if (prop.localName == 'listeners')
		{
                	var arr:Array = object[prop];
                }
	}
}
Осталось теперь вытащить тип события (event.type) и можно отписывать.

Грубо говоря есть функция, нужно вытащить тип принимаемого параметра.

Добавлено через 11 часов 38 минут
заебался рыться, пришлось написать свой спрайт

Код AS3:
package presentsimple.display 
{
	import flash.display.Sprite;
 
	/**
	 * ...
	 * @author sergey kostin (inozemcev);
	 */
	public class Sprite extends flash.display.Sprite
	{
		private var _listeners:Vector.<EventDispatcherItem>;
 
		override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void 
		{
			var item:EventDispatcherItem = new EventDispatcherItem (type, listener, useCapture);
			listeners.push (item);
			super.addEventListener(type, listener, useCapture, priority, useWeakReference);
		}
 
		override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void 
		{
			super.removeEventListener(type, listener, useCapture);
			var item:EventDispatcherItem = getListener (type, listener, useCapture);
			if (item)
			{
				listeners.splice (listeners.indexOf(item), 1);
			}
 
		}
 
		private function get listeners () :Vector.<EventDispatcherItem>
		{
			if (!_listeners) _listeners = new Vector.<EventDispatcherItem> ();
			return _listeners;
		}
 
		public function removeTypeListeners (type:String) :void
		{
			for each (var handler:EventDispatcherItem in listeners)
			{
				if (handler.type == type)
				{
					removeEventListener (handler.type, handler.listener, handler.useCapture)
				}
			}
		}
 
		public function removeAllListeners () :void
		{
			while (listeners.length) 
			{
				var handler:EventDispatcherItem = listeners.shift ();
				removeEventListener (handler.type, handler.listener, handler.useCapture)
			}
		}
 
		private function getListener (type:String, listener:Function, useCapture:Boolean = false):EventDispatcherItem
		{
			var item:EventDispatcherItem;
			for each (var handler:EventDispatcherItem in listeners)
			{
				if (handler.type == type && handler.listener == listener && handler.useCapture == useCapture)
				{
					item = handler;
					return item;
				}
			}
 
			return item;
 
		}
 
 
	}
public class EventDispatcherItem
	{
		public var type:String;
		public var listener:Function;
		public var useCapture:Boolean;
 
		public function EventDispatcherItem(type:String, listener:Function, useCapture:Boolean) 
		{
			this.type = type;
			this.listener = listener;
			this.useCapture = useCapture;
		}
 
	}
 
}


Последний раз редактировалось inozemcev; 31.10.2010 в 04:57.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:47.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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