UNPKG

easy-magix

Version:

view manager framewrok

97 lines (96 loc) 2.57 kB
/** * 多播事件对象 * @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;