addEventLinstener与attachEvent区别、兼容性问题

我们知道,绑定事件的方法一般是这样的:

//对象.事件 = 处理函数
//例如:
<input type="button" value="按钮" id="btn"/>
<script>document.getElementById('btn').onclick=function () {console.log("first");};
</script>

那么,为什么还要通过addEventLinstener或者attachEvent方法来绑定事件呢?通过下面一个例子你就知道通过(对象.事件 = 处理函数
)绑定事件的劣势:

<input type="button" value="按钮" id="btn"/>
<script>var btnObj = document.getElementById('btn');btnObj.onclick=function () {console.log("first");};btnObj.onclick=function () {console.log("second");};btnObj.onclick=function () {console.log("third");};
</script>

运行的结果是这样的:

很明显,通过(对象.事件 = 处理函数)的方式,为一个对象绑定多次同一事件,那么只有最后一次绑定执行,其他都被覆盖了,所以这就是为什么通过引用addEventLinstener和attachEvent为对象绑定事件了,下面一个例子弥补了(对象.事件 = 处理函数)方式的缺陷:
//关于addEventLinstener的语法可以点击查看

<input type="button" value="按钮" id="btn"/>
<script>var btnObj = document.getElementById('btn');btnObj.addEventListener("click",function () {console.log("first");},false);btnObj.addEventListener("click",function () {console.log("second");},false);btnObj.addEventListener("click",function () {console.log("third");},false);
</script>

运行的结果是这样的:

在IE8及以下的版本,运行结果是这样的:

那么试下通过attachEvent的方式来绑定事件:
//attachEvent方法不属于W3C标准,它是IE独有的,所以在MDN文档查不到此方法
/**attachEvent的用法:
参数1:事件类型—事件名字,有on
参数2:事件处理函数—函数(命名函数,匿名函数)
对象.attachEvent(事件类型,处理函数)*/

<input type="button" value="按钮" id="btn"/>
<script>var btnObj = document.getElementById('btn');btnObj.attachEvent("onclick",function () {console.log("first");});btnObj.attachEvent("onclick",function () {console.log("second");});btnObj.attachEvent("onclick",function () {console.log("third");});
</script>

在IE5-IE10的版本运行结果:

在谷歌、火狐,包括Edge的运行结果:

那么问题来了,如何让自己的代码可以在各个浏览器运行,不担心浏览器不支持而导致出错呢?我们知道如果这个属性在浏览器中不支持,那么这个属性的类型是undefined,判断这个属性的类型 是不是undefined,就知道浏览器是否支持,我们来验证一下:

console.log(btnObj.addEventListener);
console.log(Boolean(btnObj.addEventListener));
console.log(btnObj.attachEvent);
console.log(Boolean(btnObj.attachEvent));

//在谷歌浏览器中运行结果:

根据这个特性,我们就可以写出对象绑定事件的兼容代码:

//为任意元素.绑定任意的事件, 任意的元素(对象),事件的类型,事件处理函数function addEventListener(element,type,fn) {//判断浏览器是否支持这个方法if(element.addEventListener){element.addEventListener(type,fn,false);}else if(element.attachEvent){element.attachEvent("on"+type,fn);}else{element["on"+type]=fn;   //如果以上两种方法都不支持,则通过(对象.事件 = 处理函数)的方式绑定事件}}

解决了兼容性问题之后,我们来解决下一个问题。
相信大家都有过使用this来添加/修改属性或方法的经历,举个例子:

<input type="button" value="按钮" id="btn"/>
<script>var btnObj = document.getElementById('btn');btnObj.onclick = function() {this.value = "修改";console.log(this);}
</script>

通过这个例子,我们可以知道:匿名函数function(){}是作为btnObj对象的方法,所以函数作为一个对象的方法,被该对象所调用,那么this指向的是该对象。

我们再来看下面的代码:

<input type="button" value="按钮" id="btn"/>
<script>var btnObj = document.getElementById('btn');btnObj.addEventListener('click',function(){this.value = '修改';console.log(this);},false);
</script>

输出的结果是:

结果和我们想象的一样,this指向的是"btnObj"对象

那么再看下面一个例子:

<input type="button" value="按钮" id="btn"/>
<script>var btnObj = document.getElementById('btn');btnObj.attachEvent('onclick',function(){this.value = '修改';console.log(this);});
</script>

在IE8运行输出的结果是:

按钮没有修改,所以this指向的并不是"btnObj",而是指向windows对象,attachEvent是微软公司自己定义的一个方法,addEventListener是W3C标准的方法,所以区别是显而易见的。

那么我们来总结一下:

  • (对象.事件 = 处理函数):
优点 缺点
用法简单、所有浏览器都支持 不能为同一对象绑定多次同一事件
  • addEventLinstener与attachEvent区别
addEventLinstener attachEvent
三个参数 两个参数
谷歌、火狐、Edge支持,IE8以下版本不支持 谷歌、火狐、Edge不支持,IE5-IE10支持
addEventListener中事件的类型(事件的名字)没有on attachEvent中的事件的类型(事件的名字)有on
addEventListener 中的this是当前绑定事件的对象 attachEvent中的this是window

addEventLinstener与attachEvent区别、兼容性问题相关推荐

  1. Javascript 的addEventListener()及attachEvent()区别分析

    Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.d ...

  2. addEventListener和attachEvent的区别

    转 addEventListener和attachEvent的区别 区别如下 addEventListener共有3个参数,如下所示: element.addEventListener(type,li ...

  3. 前端开发中常见的浏览器兼容性问题及解决方案

    文章目录 前言 一.浏览器四大内核 二.主流兼容问题 (一)浏览器引擎 (二)兼容问题的原因 (三) 为什么浏览器会存在兼容性问题? (四)处理兼容问题的思路 1. 要不要做? 2. 做到什么程度? ...

  4. 浏览器兼容性及其解决方案整理

    一.了解浏览器 主流浏览器:IE(Trident内核).Firefox(火狐:Gecko内核).Safari(苹果:webkit内核).Google Chrome(谷歌:Blink内核).Opera( ...

  5. addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】

    yuanwen http://www.jb51.net/article/32511.htm 写 addEventListener 和 attachEvent 区别的博文不少,不过大部分都把重点放置于前 ...

  6. CSS中100%和inherit(继承)的区别,以及inherit的简单应用

    CSS中100%和inherit(继承)的区别 正常情况下没有区别 兼容性 100% ie6+ inherit ie8+ 该元素绝对定位,父元素使用静态定位(static)或没有使用定位时 100%继 ...

  7. javaScript盲点梳理 -- 大白话

    js扫盲目录 **js基本知识** 1.js数据类型分类 2.js 的变量数据类型确定 3.变量使用 4.js中进制 5.输入输出语句 6.isNaN() 7.typeof 没有括号 8.类型转换 9 ...

  8. JS--事件(Event)--使用

    原文网址:JS--事件(Event)--使用_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍JavaScript对Event(事件)的使用. 官网 事件介绍 - 学习 Web 开发 | MDN ...

  9. addeventlistener事件第三个参数_简析JavaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序...

    这篇文章主要介绍了javaScript 事件绑定.事件冒泡.事件捕获和事件执行顺序整理总结的相关资料 (一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式:在htm ...

最新文章

  1. STM32中printf重定向到串口
  2. Jquery 常用方法经典总结
  3. 【极客学院每日1课 】Java入门与常用技巧
  4. spring源码 — 一、IoC容器初始化
  5. 如何验证c++代码线程安全性_Python3基础:如何验证你的代码
  6. 字节跳动EB级HDFS的七年演进与实践
  7. 微信小程序父级之间的传值_微信小程序自定义组件封装及父子间组件传值的方法...
  8. HTTP协议简介,数据安全 如何保证http传输安全性,http与https区别
  9. 十六进制转换成字符串——CRC
  10. 周期三角波频谱图_雷达物位计厂家告诉你,什么是调频连续波雷达物位计
  11. 一年5个孵化项目来自于中国,佛系Apache如何帮助中国开源立足全球?
  12. rewind java_Java LongBuffer rewind()用法及代码示例
  13. 华为的IPsec ×××主模式(MAIN mode)
  14. 手把手教你学DSP 28335学习笔记
  15. PLSQL 导出、导入 表和数据
  16. Micrium uC-Probe 使用
  17. 解决Mac无法睡眠问题
  18. docker技术简介
  19. 详解Instant类
  20. 工信部191号文《App违法违规收集使用个人信息行为认定方法》

热门文章

  1. 《Head First 设计模式》(四):工厂模式
  2. 获取网络时间(国家标准时间-北京时间为准)
  3. python匿名函数可以赋值给变量_python3的匿名函数 | 吴老二
  4. java开发ria是指什么_Java RIA Demo
  5. 云通讯服务商有哪些?
  6. Redis哨兵Sentinel的搭建和原理说明
  7. VTK可移动三维坐标轴 vtkMovableAxesWidget
  8. 阿里系“玩转”区块链
  9. proteus四人抢答器_51单片机四路抢答器PROTEUS仿真报告(含C语言程序).doc
  10. 新概念模拟电路——晶体管构建的放大电路动态分析