互動:一個閉包引發(fā)的錯誤

今天封裝了一個兼容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)
    },
   ...//其他代碼,隱藏了其他跟本博文無關的方法。
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 什么是事件: 我們可以簡單的把事件理解為瀏覽器的感知系統(tǒng)。比如說:他可以感覺到用戶是否點擊(click)了頁面、鼠...
    張松1366閱讀 7,006評論 1 6
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,608評論 19 139
  • DOM DOM內容主要分為四部分: 什么是DOM和節(jié)點; 獲取節(jié)點; 節(jié)點操作(3種); 屬性操作(3種)。 什么...
    magic_pill閱讀 907評論 0 1
  • 2016.9.1 第5章 閉包 5.1 閉包是如何工作的 閉包是一個函數(shù)在創(chuàng)建時允許該自身函數(shù)訪問并操作該自身函數(shù)...
    如201608閱讀 616評論 0 0
  • (續(xù)jQuery基礎(1)) 第5章 DOM節(jié)點的復制與替換 (1)DOM拷貝clone() 克隆節(jié)點是DOM的常...
    凜0_0閱讀 1,518評論 0 8

友情鏈接更多精彩內容