首页 > 其他 > 详细

attachEvent和addEventListener区别

时间:2016-01-06 15:26:19      阅读:200      评论:0      收藏:0      [点我收藏+]

1.attachEvent与addEventListener的区别

  • 支持的浏览器不同。attachEvent在IE9以下的版本中受到支持。其它的都支持addEventListener
  • 参数不同。addEventListener第三个参数可以指定是否捕获,而attachEvent不支持捕获。
  • 事件名不同。attachEvent第一个参数事件名前要加on,比如el.attachEvent(‘onclick‘, handleClick)。
  • this不同。本文的将重点解释

 

2.attachEvent方式的事件绑定

attachEventthis总是Window。例如:

el.attachEvent(‘onclick‘, function(){
    alert(this);
});

执行后会弹出对话框:[object Window]

 

3.addEventListener方式的事件绑定

addEventListenerthis总是当前正在处理事件的那个DOM对象。 DOM Level 2 Event Model中提到,事件处理包括捕获阶段、目标阶段和冒泡阶段 。如下图:

技术分享

事件当前正在流过哪个元素,this便指向哪个元素。比如对于两级的DOM:

<div id="l1">
  <div id="l2"></div>
</div>
<script type="text/javascript">
  var l1 = document.getElementById(‘l1‘),
      l2 = document.getElementById(‘l2‘);

  l1.addEventListener(‘click‘, function () {
    console.log(‘l1 capture‘, this);
  }, true);
  l1.addEventListener(‘click‘, function () {
    console.log(‘l1 bubbling‘, this);
  });
  l2.addEventListener(‘click‘, function () {
    console.log(‘l2 target‘, this);
  });
</script>

点击div#l2后控制台输出为:

l1 capture <div id=?"l1">?…?</div>?
l2 target <div id=?"l2">?</div>?
l1 bubbling <div id=?"l1">?…?</div>?

 

4.纠正attachevent

Event.addEvent = function(target,eventType,handle){
    target.attachEvent(‘on‘+eventType,function(){
        handle.call(currentTarget,arguments);//改变this指向
    });
}

这里使用了currentTarget,我们再来顺着分析一下target与currentTarget。

addEventListener的事件处理函数中this不一定指向事实上被点击的元素, 但事件处理函数的参数Event对象提供了targetcurrentTarget属性来区分这当前对象与目标对象。 我们可以把它们都全部输出:

l1.addEventListener(‘click‘, function (e) {
  console.log(‘l1 capture‘, this, e.currentTarget, e.target);
}, true);
l2.addEventListener(‘click‘, function (e) {
  console.log(‘l2 target‘, this, e.currentTarget, e.target);
});
l2.addEventListener(‘click‘, function (e) {
  console.log(‘l2 target, invalid capture‘, this, e.currentTarget, e.target);
}, true);

结果是:

l1 capture  <div id=?"l1">?…?</div>?  <div id=?"l1">?…?</div>?  <div id=?"l2">?</div>?
l2 target   <div id=?"l2">?</div>?   <div id=?"l2">?</div>?   <div id=?"l2">?</div>?
l1 bubbling <div id=?"l1">?…?</div>?  <div id=?"l1">?…?</div>?  <div id=?"l2">?</div>?

可见currentTarget总是和this相同,而target指向事实上被点击的目标DOM对象。

 

5.补充:onclick在HTML和脚本中this指向的区别

脚本设置onclick方式的事件绑定

在javascript中设置DOM对象的onclick属性,this总是指向被设置的DOM元素。例如:

document
  .getElementById(‘l1‘)
  .onclick = function(){
    console.log(this);
  };

点击div#l1后控制台输出为:

<div id="l1">...</div>

HTML中设置onclick方式的事件绑定

在HTML中设置onclick属性相当于让Window来调用该处理函数,于是this总是Window。例如:

<div onclick="clickHandler()"></div>
<script>
function clickHandler(){
    console.log(this);
}
</script>

点击这个div后的控制台输出为:

Window {top: Window, location: Location, document: document, window: Window, external: Object…}

attachEvent和addEventListener区别

原文:http://www.cnblogs.com/shytong/p/5105536.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!