易简.道(ething)

爱在进行时
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DOM无关事件

Posted on 2013-03-12 11:17  如是如是  阅读(337)  评论(0编辑  收藏  举报

C#中,事件和委托是模块解耦的手段。在javascript中呢?

一个采用发布/订阅模式实现事件驱动的库。

 

发布/订阅模式是一种消息模式,

参与着:发布者、订阅者。

 

 

 

var PubSub={

    subscribe:function(ev,callback){

        

        //创建 _callback 对象,除非她已经存在

        var call=this._callback||(this._callback={});

        

        //针对给定的事件Key创建一个数组,除非这个数组已经存在

        //然后将回调函数追加到这个数组中

        (this._callback[ev]||(this._callback[ev]=[])).push(callback);

        returnthis;

    },

    

    publish:function(){

        

        //arguments对象转换为真正的数组

        var args=Array.prototype.slice.call(arguments,0);

        

        //拿出第1个参数,即事件的名称

        var ev=args.shift();

        

        //如果不存在 _callback对象,则返回

        //或者如果不包含给定事件对应的数组

        var list,calls,i,l;

        if(!(calls=this._callback)) returnthis;

        if(!(list=this._callback[ev])) returnthis;

        

        //触发回调

        for(i=o,l=list.length;i<l;i++)

            list[i].apply(this,args);

            

        returnthis;

        

    }

};

 

 

//使用方法,事件名称可以采用命名空间的方式来管理,例如使用冒号(:)分隔符

PubSub.subscribe("user:create",function(){/* ... */});

PubSub.publish("user:create");

 

//这时候PubSub是全局变量,可以应用于全局事件。我们也可以很容易的将其应用于局部事件。

//如下

 

var Asset={};

 

//添加PubSub

jQuery.extend(Asset,PubSub);

 

//现在就可以用publish/subcribe函数了

Asset.subscribe("create",function(){/* ... */});