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反注册事件。

上面代码有很多不足之处,希望有路过的大神指点,让小弟更有进步!!!

posted @ 2013-12-24 23:32  Sekeys  阅读(137)  评论(0)    收藏  举报