事件绑定的两种形式

      在面试中,有的时候我们想竭力的表达自己的想法,往往没有听清题目 就开始回答,所以给出的答案往往都是答非所问。面试时一定要听清面试官的题目,这样才可以在面试中做到游刃有余。而回答题目一般有两层意思:普通答案,期望答案。期望答案就是加分项,这 才是面试官真正提问这个问题的本意。比如:一般的 IE 事件绑定不 w3c 事件绑定有什么区 别?能说得上 attachEvent,addEventLisenter 的是普通答案,然后在继续 attachEvent 里 边的 this 指向会有问题,addEventLisenter 还有第三个参数,还有冒泡绑定等等用法之类 的。 所以由此得出的结论是不管我们的水平能力是多少,一定要听清题目,尽自己最大的努 力言简意赅的回答问题,而是要抓住要点。

事件绑定有两种形式:

  一、给一个对象绑定一个事件处理函数的第一种形式如下:    

obj.onclick = fn1;
function fn1(){
      alert(1);
      alert(this);
}
function fn2(){
    alert(2);
    alert(this);
}

  这种方式有个缺点:多个事件处理函数时会相互覆盖,比如:

document.onclick = fn1;
document.onclick = fn2;  //会覆盖前面绑定的fn1

二、给一个对象绑定一个事件处理函数的第二种形式如下:

    在IE下用attachEvent,标准浏览器下用addEventListener。两者之间的区别如下:

① ie: obj.attachEvent(事件名称,事件函数)

1.没有捕获
2.事件名称有on
3.多个事件函数执行的顺序:标准ie下正序 非标准ie下倒序
4.this指向window


② 标准:obj.addEventListener(事件名称,事件函数,是否捕获);

1.有捕获
2.事件名称没有on
3.多个事件执行的顺序是正序
4.this指向触发该事件的对象(在下面的例子中指的是document)

示例如下:

document.attachEvent('onclick',fn1);

document.attachEvent('onclick',fn2);

此时,attachEvent的this指向window,可利用call来修正attachEvent的this指向问题,由window对象变为document对象,具体代码如下:
document.attachEvent('onclick',function(){
    fn1.call(document);
})

document.attachEvent('onclick',function(){
    fn2.call(document);
})

document.addEventListener("click",fn1,false);
document.addEventListener("click",fn2,false);

 addEventListener的第三个参数表示是否捕获:默认是false。false代表冒泡, true代表捕获

通过如下代码,还可以发现这种方式的特点是:可以给一个对象的同一个事件绑定多个不同的函数,多个事件处理函数时不会相互覆盖。

最后,为了兼容不同的浏览器,封装bind绑定函数,同时解决attachEvent的this指向问题,具体代码如下:

function bind(obj,evname,fn){

   if(obj.addEventListener){

           obj.addEventListener(evname,fn,false);
    }else{
          obj.attachEvent('on' + evname,function(){
                fn.call(obj);
          });
    }
}


bind(document,'click',fn1);
bind(document,'click',fn2);

                

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值