老話題,關於js的自定義事件,用處很多(控件控都懂的..),最明顯的是實現觀察者模式.
簡易版代碼:
View Code
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
View Code
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的事件處理實現細節可以查看源代碼,園子里有個源碼分析系列的,偷懶的話可以看看.
