File: events/LEventDispatcher.js
/** @language chinese
* <p>LEventDispatcher 类是可调度事件的所有类的基类。</p>
* @class LEventDispatcher
* @extends LObject
* @constructor
* @since 1.8.0
* @public
*/
var LEventDispatcher = (function () {
function LEventDispatcher () {
var s = this;
LExtends(s, LObject, []);
s._eventList = new Array();
}
var p = {
/** @language chinese
* <p>使用 LEventDispatcher 对象注册事件侦听器对象,以使侦听器能够接收事件通知。可以为特定类型的事件、阶段和优先级在显示列表中的所有节点上注册事件侦听器。</p>
* <p>成功注册一个事件侦听器后,无法通过额外调用 addEventListener() 来更改其优先级。要更改侦听器的优先级,必须首先调用 removeListener()。然后,可以使用新的优先级再次注册该侦听器。</p>
* <p>如果不再需要某个事件侦听器,可调用 removeEventListener() 删除它,否则会产生内存问题。</p>
* @method addEventListener
* @param {String} type 事件的类型。
* @param {Function} listener 处理事件的侦听器函数。
* @public
* @since 1.8.0
*/
addEventListener : function (type, listener) {
this._eventList.push({listener : listener, type : type});
},
/** @language chinese
* <p>从 LEventDispatcher 对象中删除侦听器。如果没有向 LEventDispatcher 对象注册任何匹配的侦听器,则对此方法的调用没有任何效果。</p>
* @method removeEventListener
* @param {String} type 事件的类型。
* @param {Function} listener 要删除的侦听器对象。
* @public
* @since 1.8.0
*/
removeEventListener : function (type, listener) {
var s = this, i, length;
length = s._eventList.length;
for (i = 0; i < length; i++) {
if (!s._eventList[i]) {
continue;
}
if (type == s._eventList[i].type && (!listener || s._eventList[i].listener == listener)) {
s._eventList.splice(i, 1);
return;
}
}
},
/** @language chinese
* <p>从 LEventDispatcher 对象中删除所有侦听器。</p>
* @method removeAllEventListener
* @public
* @since 1.8.0
*/
removeAllEventListener : function () {
this._eventList = [];
},
/** @language chinese
* <p>将事件调度到事件流中。事件目标是对其调用 dispatchEvent() 方法的 LEventDispatcher 对象。</p>
* @method dispatchEvent
* @param {LEvent | String} event 调度到事件流中的 Event 对象。如果正在重新调度事件,则会自动创建此事件的一个克隆。在调度了事件后,其 target 属性将无法更改,因此您必须创建此事件的一个新副本以能够重新调度。
* @return {Boolean} 如果成功调度了事件,则值为 true。
* @example
* function MyEventObject(){
* var self = this;
* LExtends(self,LSprite,[]);
* self.graphics.drawRect(1,"#000000",[0,0,100,100],true,"#000000");
* self.graphics.drawRect(1,"#FF0000",[100,0,100,100],true,"#FF0000");
* self.addEventListener(LMouseEvent.MOUSE_UP,self.onclick);
* self.addEventListener(MyEventObject.CLICK_LEFT,function(event){
* trace("dispatchEvent");
* });
* self.addEventListener(MyEventObject.CLICK_RIGHT,function(event){
* trace("dispatchEvent event.name = " + event.name);
* });
* }
* MyEventObject.CLICK_LEFT = "click_left";
* MyEventObject.CLICK_RIGHT = "click_right";
* MyEventObject.prototype.onclick = function(event){
* var self = event.clickTarget;
* if(event.selfX < 100){
* self.dispatchEvent(MyEventObject.CLICK_LEFT);
* }else{
* var event = new LEvent(MyEventObject.CLICK_RIGHT);
* event.name = "LEvent Test";
* self.dispatchEvent(event);
* }
* }
* @examplelink <p><a href="../../../api/LEventDispatcher/dispatchEvent.html" target="_blank">测试链接</a></p>
* @public
* @since 1.8.0
*/
dispatchEvent : function (event) {
var s = this, i, length = s._eventList.length, ctype = (typeof event == "string") ? event : event.eventType;
for (i = 0; i < length; i++) {
if (!s._eventList[i]) {
continue;
}
if (ctype == s._eventList[i].type) {
if (typeof event == "string") {
s.currentTarget = s.target = s;
s.eventType = s.event_type = ctype;
s._eventList[i].listener(s);
delete s.currentTarget;
delete s.target;
delete s.eventType;
}else{
if (!event.target) {
event.target = s;
}
if (!event.currentTarget) {
event.currentTarget = event.target;
}
event._ll_preventDefault = false;
s._eventList[i].listener(event);
if (event._ll_preventDefault) {
return false;
}
}
return true;
}
}
return false;
},
/** @language chinese
* <p>检查 LEventDispatcher 对象是否为特定事件类型注册了任何侦听器。这样,您就可以确定 LEventDispatcher 对象在事件流层次结构中的哪个位置改变了对事件类型的处理。</p>
* @method hasEventListener
* @param {String} type 事件的类型。
* @return {Boolean} 如果指定类型的侦听器已注册,则值为 true;否则,值为 false。
* @public
* @since 1.8.0
*/
hasEventListener : function (type, listener) {
var s = this, i, length = s._eventList.length;
for (i = 0; i < length; i++) {
if (!s._eventList[i]) {
continue;
}
if (type == s._eventList[i].type) {
if (typeof listener == UNDEFINED || listener == s._eventList[i].listener) {
return true;
}
}
}
return false;
}
};
for (var k in p) {
LEventDispatcher.prototype[k] = p[k];
}
return LEventDispatcher;
})();