自訂事件:使用者可以指定事件類型,這個類型其實就是一個字串,然後為這個類型的事件指定事件處理函數,可以註冊多個事件處理函數(用陣列管理),當呼叫時,從多個事件處理函數中找到再呼叫。
function EventTarget(){ this.handlers={}; } EventTarget.prototype={ constructor:EventTarget, addHandler:function(type,handler){ if(typeof this.handlers[type]=='undefined'){ this.handlers[type]=new Array(); } this.handlers[type].push(handler); }, removeHandler:function(type,handler){ if(this.handlers[type] instanceof Array){ var handlers=this.handlers[type]; for(var i=0,len=handlers.length;i<len;i++){ if(handler[i]==handler){ handlers.splice(i,1); break; } } } }, trigger:function(event){ if(!event.target){ event.target=this; } if(this.handlers[event.type] instanceof Array){ var handlers=this.handlers[event.type]; for(var i=0,len=handlers.length;i<len;i++){ handlers[i](event); } } } }
addHandler方法用於新增事件處理程序,removeHandler方法用於移除事件處理程序,所有的事件處理程序在屬性handlers中統一儲存管理。呼叫trigger方法觸發一個事件,該方法接收一個至少包含type屬性的物件作為參數,觸發的時候會尋找handlers屬性中對應type的事件處理程序。寫段程式碼測試一下。
function onClose(event){ alert('message:'+event.message); } var target=new EventTarget(); target.addHandler('close',onClose); //浏览器不能帮我们创建事件对象了,自己创建一个,自定义事件对象的属性 var event={ type:'close', message:'Page Cover closed!' }; target.trigger(event);