js 自定义事件器
先贴上代码,再做分析
function _listeners() { this.add = function (fn) { if (ns.j.isFn(fn)) { this.push(fn); } } this.remove = function (fn) { var len = this.length; for (var i = 0; i < len; i++) { if (this[i] && this[i] === fn) { this.push(i); } } } this.fire = function (args) { if (!this.on) { return; } var len = this.length; var e = { canBubble: false, returnValue: true, args: arguments,eventSrc:this.eventSrc }; for (var i = 0; i < len; i++) { if (e.canBubble) { break; } if (ns.j.isFn(this[i])) { ( function f(t) { this[i].call(this.eventSrc, e,args); }).call(this,arguments); } } return e; } this.on = true; this.clear = function () { for (var i = 0; i < len; i++) { this.pop(i); } this.length = 0; } this.eventSrc = null; this.eventArgs = {}; this.__inited = false; if (this.__inited && this.eventSrc!=null) { this.fire(arguments); } } ns.extend.pro(_listeners, Array); _listeners.reg = function (o, e, fn) { if (!o || !e) { return; } if (o[e]) { delete o[e]; } o[e] = new _listeners(); o[e].eventSrc = o; o[e].__inited = true; if (fn) { o[e].add(fn); } } _listeners.unReg = function (o, e) { if (!o || !e) { return; } delete o[e]; }
这些代码是原本自己在项目的使用到的,自定义对象的自定义事件组,但是有很多残缺的地方。
在这个_listeners作为事件装饰器,而add和remove是对事件添加或移除相应的行为,而正在的有个地方我一直没搞懂,如何触发事件,我就想多了上面代码形式的方法,让_listener继承Array,利用fire方法来执行一次执行所有的事件行为,其实作为程序员,更想代码简单化点,于是我在构造函数中添加了如下代码
this.__inited = false; if (this.__inited && this.eventSrc!=null) { this.fire(arguments); }
但是困扰的是冒泡。就是说,但我不想让他们继续运行怎么办,于是我设定了e参数{canBubble: false/*为true阻止冒泡*/, returnValue: true/*返回值需要*/, args: arguments/*事件参数*/,eventSrc:this.eventSrc/*事件源对象*/}。其实为了简便,我利用了临时函数call,将this替换为eventSrc。这样更加简单了点,然而在改的过程中却还是保留了args的参数。
这只是我敢时间临时写的一种自定义事件装饰器。。
在上面值得注意的是:_listener继承数组Array,拥有两个静态方法:reg注册事件,unReg反注册事件。
上面代码有很多不足之处,希望有路过的大神指点,让小弟更有进步!!!

浙公网安备 33010602011771号