1.attachEvent与addEventListener的区别

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

2.attachEvent方式的事件绑定

attachEventthis总是Window。例如:

  1. el.attachEvent('onclick', function(){
  2. alert(this);
  3. });

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

3.addEventListener方式的事件绑定

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

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

  1. <div id="l1">
  2. <div id="l2"></div>
  3. </div>
  4. <script type="text/javascript">
  5. var l1 = document.getElementById('l1'),
  6. l2 = document.getElementById('l2');
  7.  
  8. l1.addEventListener('click', function () {
  9. console.log('l1 capture', this);
  10. }, true);
  11. l1.addEventListener('click', function () {
  12. console.log('l1 bubbling', this);
  13. });
  14. l2.addEventListener('click', function () {
  15. console.log('l2 target', this);
  16. });
  17. </script>

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

  1. l1 capture <div id=​"l1">​…​</div>​
  2. l2 target <div id=​"l2">​</div>​
  3. l1 bubbling <div id=​"l1">​…​</div>​

4.纠正attachevent

  1. Event.addEvent = function(target,eventType,handle){
  2. target.attachEvent('on'+eventType,function(){
  3. handle.call(currentTarget,arguments);//改变this指向
  4. });
  5. }

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

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

  1. l1.addEventListener('click', function (e) {
  2. console.log('l1 capture', this, e.currentTarget, e.target);
  3. }, true);
  4. l2.addEventListener('click', function (e) {
  5. console.log('l2 target', this, e.currentTarget, e.target);
  6. });
  7. l2.addEventListener('click', function (e) {
  8. console.log('l2 target, invalid capture', this, e.currentTarget, e.target);
  9. }, true);

结果是:

  1. l1 capture <div id=​"l1">​…​</div>​ <div id=​"l1">​…​</div>​ <div id=​"l2">​</div>​
  2. l2 target <div id=​"l2">​</div>​ <div id=​"l2">​</div>​ <div id=​"l2">​</div>​
  3. 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元素。例如:

  1. document
  2. .getElementById('l1')
  3. .onclick = function(){
  4. console.log(this);
  5. };

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

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

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

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

  1. <div onclick="clickHandler()"></div>
  2. <script>
  3. function clickHandler(){
  4. console.log(this);
  5. }
  6. </script>

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

  1. 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. 如何设置vim中tab键缩进---配置初始化设置

    转载自:http://blog.51cto.com/xuding/1725376:加了一些补充说明 问题: Linux系统下,Tab键默认为8个字符,需呀将其修改为4个字符的方式使用 步骤: 1.在用 ...

  2. C语言中线程和进程的区别

    线程是指进程内的一个执行单元也是进程内的可调度的实体,与进程的区别 1) 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 2) 并发性:不仅进程之间可以并发执行,同一个进程之间的多个线 ...

  3. Scala类型检查与转换

    Scala类型检查与转换 isInstanceOf:检查某个对象是否属于某个给定的类. asInstanceOf:将引用转换为子类的引用. classOf:如果想测试p指向的是一个Employee对象 ...

  4. hdu 1058

    这道题有很多种做法,但是思路大都是一样的,代码有点类似于poj2591这道题. 题意:问因子只含有2,3,5,7的第k个数是什么? #include<stdio.h> int f[5843 ...

  5. 使用ABP框架踩过的坑系列1

        企业级(例如ERP)应用, 一遍一遍的在重复:认证.验证.异常处理.日志.国际化和本地化.数据库连接管理.配置管理. 审计记录等,同时.NET有很多最佳实践:分层.模块化.DDD领域驱动.DI ...

  6. 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)

    在使用百度编辑器ueditor的时候,怎么将图片保存到另一个服务器,或者上传到ftp服务器?这个问题,估计很多使用UE的人会遇到.而且我百度过,没有找到这个问题的解决方案.那么:本篇文章就很适合你了. ...

  7. VS2017仅我的代码警告

    每次调试都会出现"仅我的代码"警告,特别的烦人,取消方法如下: 1.点击工具,选择选项. 2.选择调试→常规,取消“启动时若没有用户代码则发出警告(仅限托管)”选项.

  8. F#语言入门之什么是F#语言

    F#是一种函数式编程语言,可以轻松编写正确且可维护的代码. F#编程主要涉及定义类型推断和自动泛化的类型和函数. 这使您可以将焦点保留在问题域上并操纵其数据,而不是编程的细节. open System ...

  9. Redux其实很简单(原理篇)

    在这一篇文章中,笔者将带大家编写一个完整的Redux,深度剖析Redux的方方面面,读完本篇文章后,大家对Redux会有一个深刻的认识. 核心API 这套代码是笔者阅读完Redux源码,理解其设计思路 ...

  10. python 简单搭建阻塞式单进程,多进程,多线程服务

    由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 :  --> 点击这里 我们可以通过这样子的方式去理解apache的工作原理 1 单进程TCP服 ...