Skip to content

Instantly share code, notes, and snippets.

@k0t0vich
Created October 19, 2013 16:50
Show Gist options
  • Select an option

  • Save k0t0vich/7058378 to your computer and use it in GitHub Desktop.

Select an option

Save k0t0vich/7058378 to your computer and use it in GitHub Desktop.
import flash.events.Event;
import flash.utils.Format;
/**
* EventDispatcher class. Provides a basic AS3 EventDispatcher
* functionality.
* @author k0t0vich
*/
class flash.events.EventDispatcher
{
public var className:String = "EventDispatcher";
private var _eventListeners:Array;
/**
* Ссылка на родителя - диспетчера
*/
public var eventParent=null;
/**
* Constructor. Creates new EventDispatcher instance.
*/
public function EventDispatcher(eventParentLink)
{
super();
eventParent = eventParentLink;
_eventListeners = [];
}
/**
* Adds listener Function for the specified Event.
* @param event String. Event to listen to.
* @param listener Function. The listening function.
* @param scope Object. Listener's scope object.
*/
public function addEventListener(event:String,listener:Function, scope:Object):Void
{
trace("EventDispatcher.addEventListener > event : " + event + ", listener : " + listener + ", scope : " + scope);
if (scope==undefined) scope = this;
var i:Number;
var l:Number = _eventListeners.length;
var obj:Object;
for (i = 0; i < l; i++)
{
obj = _eventListeners[i];
if (obj.e == event && obj.f == listener &&
obj.o == scope) return;
}
_eventListeners.push( { e:event, f:listener, o:scope } );
}
/**
* Unregisters listener Function for the specified Event.
* @param event String. Event to be unregistered from.
* @param fn Function. The listening function.
* @param ob Object. Listener's scope object.
*/
public function removeEventListener(event:String, listener:Function, scope:Object):Function
{
trace("EventDispatcher.removeEventListener > event : " + event + ", listener : " + listener + ", scope : " + scope);
if (scope==undefined) scope = this;
var i:Number;
var l:Number = _eventListeners.length;
var obj:Object;
for (i = 0; i < l; i++)
{
obj = _eventListeners[i];
if (obj.e != event) continue;
if (obj.f != listener) continue;
if (obj.o != scope) continue;
return _eventListeners.splice(i, 1)[0].f;
}
return null;
}
/**
* Invokes all event-listener functions with the specified Event.
* @param event Event. The event-object to be passed to the listening function.
*/
public function dispatchEvent(event:Event):Void
{
trace("EventDispatcher.dispatchEvent > event : " + event);
event.currentTarget = this;
//trace("EventDispatcher.dispatchEvent > event : " + event);
////trace (this + ".dispatchEvent" + event);
var i:Number = 0;
var l:Number = _eventListeners.length;
// тут нужно всё время длину брать,т.к. она может изменится в процессе.. например отписка от события одного клика..
//for (i = 0; i < l; i++)
for (i = 0; i < _eventListeners.length; i++)
{
if (event.type != _eventListeners[i].e) continue;
_eventListeners[i].f.apply(_eventListeners[i].o, [event.clone()]);
}
dispatchBubblesEvent(event);
delete event;
}
// всплытие событий
public function dispatchBubblesEvent(event:Event):Void
{
trace("EventDispatcher.dispatchBubblesEvent > event : " + event);
//trace("EventDispatcher.dispatchBubblesEvent > event : "+ this["eventParent"]+" "+ event);
if (event.bubbles && this["eventParent"].dispatchEvent)
{
var bubblesEvent:Event = event.clone();
bubblesEvent.target = this["eventParent"];
this["eventParent"].dispatchEvent(bubblesEvent);
}
delete event;
}
public function toString():String
{
return Format.formatToString(this);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment