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区别总结的更多相关文章

  1. attachEvent和addEventListener区别

    一般来说,可以直接封装成这种形式: var addEvent = function(element,type,handler){ if(element.addEventListener){ //DOM ...

  2. attachEvent与addEventListener的区别 真实例子

    转自:https://www.cnblogs.com/Rosefxd/p/4921330.html 近日遇到attachEvent与addEventListener两个事件,哟,果断研究一下~~ 先普 ...

  3. (转载)JS事件监听 JS:attachEvent和addEventListener使用方法

    (转载)http://www.chhua.com/web-note146 attachEvent和addEventListener使用方法 Js代码 <html> <head> ...

  4. JS事件监听 JS:attachEvent和addEventListener 使用方法

    attachEvent与addEventListener区别适应的浏览器版本不同,同时在使用的过程中要注意attachEvent方法          按钮onclickaddEventListene ...

  5. attachEvent和addEventListener

    attachEvent和addEventListener在前端开发过程中经常性的使用,他们都可以用来绑定脚本事件,取代在html中写obj.onclick=method. 相同点: 它们都是dom对象 ...

  6. js中添加事件 attachEvent 与 addEventListener

    给元素添加事件时,使用js进行实现时产生了疑惑,有关事件浏览器兼容的问题,在此记录如下. <!DOCTYPE html> <html> <head> <met ...

  7. attachEvent与addEventlistener兼容性

    关于原生事件绑定中attachEvent与addEventlistener中兼容性以及attachEvent函数中this指代window有关问题   请点击下面回答中的"采纳为答案&quo ...

  8. JavaScript中的attachEvent和addEventListener

    attachEvent和addEventListener在前端开发过程中经常性的使用,他们都可以用来绑定脚本事件,取代在html中写obj.onclick=method. 相同点: 它们都是dom对象 ...

  9. attachEvent 与 addEventListener 的监听

    说到 attachEvent 与 addEventListener 的事件必然会提到  浏览器的判断,因为attachEvent只适用于于IE 先来看看常用的浏览器的判断 //判断浏览器类型 if(n ...

随机推荐

  1. python 修改文件编码方式

    import chardet import os def strJudgeCode(str): return chardet.detect(str) def readFile(path): try: ...

  2. php读取用友u8客户档案

    include('../common/conn.php'); $list=[]; $sql="SELECT a.cCusCode,a.cCusName,b.cCCName,a.cCusDep ...

  3. webuploader 文件上传总结

    $(function() { /** * 初始化Web Uploader */ var uploader = WebUploader.create({ swf : '../mobile/Uploade ...

  4. not allowed to access to crontab because of pam configuration

    如果运行crontab如遇下面这样的错误: $ crontab -l You (zhangsan) are not allowed to access to (crontab) because of ...

  5. Ubuntu在命令行开启远程桌面

    在终端执行下列三个命令即可 gsettings set org.gnome.Vino enabled truegsettings set org.gnome.Vino prompt-enabled f ...

  6. 一个用css写出来的下拉菜单

    1 <style> 2 /* css*/ 3 #body{ 4 float: left; 5 } 6 #xialakuang{ 7 background-color:#f9f9f9; 8 ...

  7. hdu 5046 二分+DLX模板

    http://acm.hdu.edu.cn/showproblem.php?pid=5046 n城市建k机场使得,是每个城市最近机场的距离的最大值最小化 二分+DLX 模板题 #include < ...

  8. Python学习-29.Python中列表的一些操作

    in关键字: 注意这个是关键字,用来判断元素是否在集合中存在. list = ['a','b','c'] print('a' in list) print('f' in list) 将依次输出 Tru ...

  9. TFS 如何強制撤銷被簽出的文件

    我们在使用TFS (Team Foundation Server) 源代码管理的时候,源代码管理会在每个PC上创建一个工作区,然后这个工作区域映像到服务器上的源码文件夹,我们在正常签入,签出的时候,我 ...

  10. sklearn使用小记GridSearchCV

    def test_grid_search(): from sklearn import datasets,svm iris = datasets.load_iris() parameters = {' ...