今天封裝了一個兼容ie的通用事件處理程序,廢話不多說,上代碼。
var EventHandler = {
addEventListener:function(ele,type,callback){
if(ele.addEventListener){
EventHandler.addEventListener = function(){
ele.addEventListener(type,callback,false)
}
}else if(ele.attachEvent){
EventHandler.attachEvent = function(){
ele.attachEvent('on'+type,callback)
}
}else{
ele['on'+type]=callback
}
EventHandler.addEventListener(ele,type,callback)
},
...//其他代碼,隱藏了其他跟本博文無關的方法。
}
上面對addEventListener進行了兼容封裝和惰性載入。
然而在用的時候卻發(fā)現(xiàn)了一個奇怪的問題:
EventHandler.addEventListener(document,'click',function(){
console.log('1')
})
EventHandler.addEventListener(document,'click',function(){
console.log('2')
})
上述代碼給document綁定了兩個點擊事件,分別輸出1、2。然而在實際運行中,卻發(fā)現(xiàn)只輸出了1,沒有輸出2!
為什么呢?暫且讓你們思考下~提示:閉包??!
//尷尬。。沒人留言。。
EventHandler.addEventListener = function(){
ele.addEventListener(type,callback,false)
}
此處產生了閉包。type,callback變量均引用了第一次調用的變量。而dom中給一個element綁定多個相同的函數(shù)事件時,只會觸發(fā)一次。修正方法:
var EventHandler = {
addEventListener:function(ele,type,callback){
if(ele.addEventListener){
EventHandler.addEventListener = function(ele,type,callback){
ele.addEventListener(type,callback,false)
}
}else if(ele.attachEvent){
EventHandler.attachEvent = function(ele,type,callback){
ele.attachEvent('on'+type,callback)
}
}else{
ele['on'+type]=callback
}
EventHandler.addEventListener(ele,type,callback)
},
...//其他代碼,隱藏了其他跟本博文無關的方法。
}