互动:一个闭包引发的错误

今天封装了一个兼容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进行了兼容封装和惰性载入。
然而在用的时候却发现了一个奇怪的问题:

EventHandler.addEventListener(document,'click',function(){
  console.log('1')
})
EventHandler.addEventListener(document,'click',function(){
  console.log('2')
})

上述代码给document绑定了两个点击事件,分别输出1、2。然而在实际运行中,却发现只输出了1,没有输出2!
为什么呢?暂且让你们思考下~提示:闭包!!
//尴尬。。没人留言。。
EventHandler.addEventListener = function(){
ele.addEventListener(type,callback,false)
}
此处产生了闭包。type,callback变量均引用了第一次调用的变量。而dom中给一个element绑定多个相同的函数事件时,只会触发一次。修正方法:

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)
    },
   ...//其他代码,隐藏了其他跟本博文无关的方法。
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是事件: 我们可以简单的把事件理解为浏览器的感知系统。比如说:他可以感觉到用户是否点击(click)了页面、鼠...
    张松1366阅读 6,847评论 1 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • DOM DOM内容主要分为四部分: 什么是DOM和节点; 获取节点; 节点操作(3种); 属性操作(3种)。 什么...
    magic_pill阅读 798评论 0 1
  • 2016.9.1 第5章 闭包 5.1 闭包是如何工作的 闭包是一个函数在创建时允许该自身函数访问并操作该自身函数...
    如201608阅读 572评论 0 0
  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 1,387评论 0 8