js简易版自定义事件及其应用

COME FROM

老话题,关于js的自定义事件,用处很多(控件控都懂的..),最明显的是实现观察者模式.

简易版代码:

复制代码
 1 function Class1(){      
 2     } 
 3     Class1.prototype ={ 
 4         //间接调用 
 5         evt : function(){ 
 6             if(this.onEvt){ 
 7                 for(i=0; i<this.onEvt.length; i++){ 
 8                     this.onEvt[i]();    //逐个调用处理函数 
 9                 } 
10             } 
11         }, 
12         //添加事件处理函数 
13         attchOnEvt : function(_eventHandler){ 
14             if(!this.onEvt) 
15                 this.onEvt = [];    //存放事件处理函数 
16             this.onEvt.push(_eventHandler); 
17         }, 
18         //删除 
19         detachOnEvt : function(_eventHandler){ 
20             this.onEvt.pop(_eventHandler); 
21         }        
22     } 
23     
24     //包装下事件处理函数,使其可以接收参数 
25     function MakeFunc(obj,strFunc){ 
26         var args = [];    //存放参数 
27         if(!obj) 
28             obj = window; 
29         for(var i=2; i<arguments.length; i++){ 
30             args.push(arguments[i]); 
31         } 
32         return function(){ 
33             obj[strFunc].apply(obj,args);    //调用具体处理函数 
34         } 
35         
36     } 
37     
38     //处理函数-路人甲 
39     function _eventFunc(sName){ 
40         console.log("i'm "+ sName); 
41     } 
42     
43     //test 
44     var obj = new Class1(); 
45     obj.attchOnEvt(MakeFunc(null, "_eventFunc", "kobe")); 
46     obj.evt(); 
47     obj.detachOnEvt(MakeFunc(null, "_eventFunc", "kobe")); 
48     obj.evt();    
复制代码

主要涉及到参数传递问题,由于事件处理函数是没有参数的,所以用了个包装类将其转换了下,实现了参数的传递,主要是arguments和apply的使用.

 

相关

jq提供了实现自定义事件的函数.主要是bind,unbind,trigger顾名思义就是用来实现事件绑定以及触发.

比较简单,直接上代码(列子是实现观察者模式),具体使用查api

复制代码
 1 //被观察对象
 2 var Subject = {
 3 };    
 4 $(Subject).bind("evtHandler",function(event,sName){
 5     console.log("i'm "+sName);
 6 })
 7 
 8 //观察者
 9 var Observer = {
10     count : 0
11 };
12 //订阅事件
13 Observer.regist = function(){
14     $(Subject).bind("evtHandler.Observer",function(event,sName){
15                     Observer.count++;    //当订阅的事件被触发时,进行逻辑处理
16                     console.log(sName +"'s count: "+Observer.count);
17                     })
18 } 
19 Observer.regist();
20 
21 //触发事件
22 $(Subject).trigger("evtHandler",["num1"]);
复制代码

 

其他:关于jq的事件处理实现细节可以查看源代码,园子里有个源码分析系列的,偷懒的话可以看看.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值