easy-magix
Version:
view manager framewrok
97 lines (96 loc) • 2.57 kB
JavaScript
/**
* 多播事件对象
* @name Event
* @namespace
*/
var Event_ON = 'on';
var Event = {
/**
* @lends Event
*/
/**
* 触发事件
* @param {String} name 事件名称
* @param {Object} data 事件对象
* @param {Boolean} [remove] 事件触发完成后是否移除这个事件的所有监听
* @param {Boolean} [lastToFirst] 是否从后向前触发事件的监听列表
*/
fire: function (name, data, remove, lastToFirst) {
var key = G_SPLITER + name,
me = this,
list = me[key],
end, len, idx, t;
if (!data) data = {};
if (!data.type) data.type = name;
if (list) {
end = list.length;
len = end - 1;
while (end--) {
idx = lastToFirst ? end : len - end;
t = list[idx];
if (t.f) {
t.x = 1;
G_ToTry(t.f, data, me);
t.x = G_EMPTY;
} else if (!t.x) {
list.splice(idx, 1);
len--;
}
}
}
list = me[Event_ON + name];
if (list) G_ToTry(list, data, me);
if (remove) me.off(name);
},
/**
* 绑定事件
* @param {String} name 事件名称
* @param {Function} fn 事件处理函数
* @example
* var T = Magix.mix({},Magix.Event);
* T.on('done',function(e){
* alert(1);
* });
* T.on('done',function(e){
* alert(2);
* T.off('done',arguments.callee);
* });
* T.fire('done',{data:'test'});
* T.fire('done',{data:'test2'});
*/
on: function (name, fn) {
var me = this;
var key = G_SPLITER + name;
var list = me[key] || (me[key] = []);
list.push({
f: fn
});
},
/**
* 解除事件绑定
* @param {String} name 事件名称
* @param {Function} [fn] 事件处理函数
*/
off: function (name, fn) {
var key = G_SPLITER + name,
me = this,
list = me[key],
i, t;
if (fn) {
if (list) {
i = list.length;
while (i--) {
t = list[i];
if (t.f == fn) {
t.f = G_EMPTY;
break;
}
}
}
} else {
delete me[key];
delete me[Event_ON + name];
}
}
};
Magix.Event = Event;