addEventListener()和attachEvent()相同点和不同点

相同点:
① 它们都是dom对象的方法,可以实现一种事件绑定多个事件处理函数;
② 相对于普通的DOM事件处理element.event = fun();的写法来说,使用attachEvent和addEventListener时则可以实现多个事件处理函数的调用;

不同点:
① attachEvent是IE有的方法,它不遵循W3C标准,而其他的主流浏览器如FF等遵循W3C标准的浏览器都使用addEventListener,所以实际开发中需分开处理 — 涉及兼容;
② 多次绑定后执行的顺序是不一样的,attachEvent是后绑定先执行,addEventListener是先绑定先执行;
③ 绑定时间时,attachEvent必须带on,如onclick,onmouseover等,而addEventListener不能带on,如click,mouseover ;
④ attachEvent仅需要传递两个参数,而addEventListener需要传递三个参数,这里牵扯到“事件流”的概念。侦听器在侦听时有三个阶段:捕获阶段、目标阶段和冒泡阶段。顺序为:捕获阶段(根节点到子节点检查是否调用了监听函数)→目 标阶段(目标本身)→冒泡阶段(目标本身到根节点)。此处的参数确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。 如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。 如果useCapture 为 false,则侦听器只在目标或冒泡阶段处理事件。 要在所有三个阶段都侦听事件,请调用两次 addEventListener,一次将 useCapture 设置为 true,第二次再将useCapture 设置为 false;

关于 ④ 的理解可以转至:点这里(讲解一下这两个参数顺便补一下事件冒泡和事件捕获的概念理解)

例子:

// 普通事件处理函数 --- 只执行最后一个事件绑定函数(只执行最后绑定的事件回调 >>> 3)btn.onclick = function(){alert(1);}btn.onclick = function(){alert(2);}btn.onclick = function(){alert(3);}
// attachEvent事件处理函数调用 --- 后绑定先执行(IE8- >>> 3 2 1)btn1.attachEvent("onclick",function(){ alert(1); })btn1.attachEvent("onclick",function(){ alert(2); })btn1.attachEvent("onclick",function(){ alert(3); })
 // addEventListener事件处理函数 --- 先绑定先执行(IE9+/主流浏览器 >>> 1 2 3)btn2.addEventListener("click",function(){ alert(1); },false)btn2.addEventListener("click",function(){ alert(2); },false)btn2.addEventListener("click",function(){ alert(3); },false)

封装 – 不同浏览器监听事件和清除事件的方法

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Document</title>
</head>
<body><button id="btn">点我</button>
</body>
<script type="text/javascript">
/**对监听事件做兼容处理* 参数解释:* element: 监听事件源* type: 为监听事件名,如click,submit等* handler: 为监听事件所执行的函数* 调用: EventUtil.addHandler(添加事件)/removeHandler(移除事件)*/var EventUtil = {addHandler : function(type, handler, element){this.checked(type, handler, element);if(element.addEventListener){element.addEventListener(type, handler, false);}else if(element.attachEvent){element.attachEvent('on' + type, handler);}else{element['on' + type] = handler;}},removeHandler : function(type, handler, element){this.checked(type, handler, element);if(element.removeEventListener){element.removeEventListener(type, handler, false);}else if(element.detachEvent){element.detachEvent('on' + type, handler);}else{element['on' + type] = null;}},checked: function(type, handler, element){if(!(typeof(type) == 'string')) throw new Error("The parameter is required and the parameter type is String");if(!(handler instanceof Function)) throw new Error("The parameter is required and the parameter type is Function");return element = element ? element : document;}}var a = 111;var btn = document.getElementById('btn');var handler = function(){console.log('Hello World!');/* 移除事件 */// EventUtil.removeHandler(btn,'click',handler);}/* 添加事件 */EventUtil.addHandler('click', handler, btn);
</script>
</html>

使用哈希值-表封装

function addEvent(element, type, handler) {//为每一个事件处理函数分派一个唯一的IDif (!handler.$$guid) handler.$$guid = addEvent.guid++;//为元素的事件类型创建一个哈希表if (!element.events) element.events = {};//为每一个"元素/事件"对创建一个事件处理程序的哈希表var handlers = element.events[type];if (!handlers) {handlers = element.events[type] = {};//存储存在的事件处理函数(如果有)if (element["on" + type]) {handlers[0] = element["on" + type];}}//将事件处理函数存入哈希表handlers[handler.$$guid] = handler;//指派一个全局的事件处理函数来做所有的工作element["on" + type] = handleEvent;};//用来创建唯一的ID的计数器addEvent.guid = 1;function removeEvent(element, type, handler) {//从哈希表中删除事件处理函数if (element.events && element.events[type]) {delete element.events[type][handler.$$guid];}};function handleEvent(event) {var returnValue = true;//抓获事件对象(IE使用全局事件对象)event = event || fixEvent(window.event);//取得事件处理函数的哈希表的引用var handlers = this.events[event.type];//执行每一个处理函数for (var i in handlers) {this.$$handleEvent = handlers[i];if (this.$$handleEvent(event) === false) {returnValue = false;}}return returnValue;};//为IE的事件对象添加一些“缺失的”函数  --  冒泡兼容IE的处理function fixEvent(event) {//添加标准的W3C方法event.preventDefault = fixEvent.preventDefault;event.stopPropagation = fixEvent.stopPropagation;return event;};fixEvent.preventDefault = function () {this.returnValue = false;};fixEvent.stopPropagation = function () {this.cancelBubble = true;};

【兼容封装】addEventListener()和attachEvent()跨浏览器的兼容性处理相关推荐

  1. location.host与location.hostname和跨浏览器的兼容性?

    本文翻译自:location.host vs location.hostname and cross-browser compatibility? Which one of these is the ...

  2. Selenium Grid跨浏览器-兼容性测试

    Selenium Grid跨浏览器-兼容性测试 这里有两台机子,打算这样演示: 一台机子启动一个作为主点节的hub 和 一个作为次节点的hub(系统windows 浏览器为ie) ip为:192.16 ...

  3. animate.css 兼容ie,animate.css一个跨浏览器的CSS动画库

    animate.css一个跨浏览器的CSS动画库.简单易用.虽然已Star,但每次使用使用时都要在stars里查找...当然啦,更多动画库可以参考这里. 如何使用 要在网站中使用animate.css ...

  4. postcss解决兼容_使用PostCSS进行跨浏览器兼容性

    postcss解决兼容 在上一个教程中,我们总结了本系列的"快速入门"部分,现在我们可以继续使用PostCSS生成样式表,并使用各种类型的插件实现各种目的. 在本教程中,我们将使用 ...

  5. ie浏览器html图片兼容,解决webp图片格式IE浏览器不兼容性问题

    这两天把博客,图片格式改了一下,今天晚上,正好用ie浏览器打开pdf文件,然后突然想起,试试这个浏览器的兼容性, 发现图片加载不出来了,报错了 无法对位于 URL"https://img.b ...

  6. 兼容浏览器_你知道什么是跨浏览器兼容吗?

    文章来自:卓码软件测评 在过去的二十年里,互联网得到了巨大的发展.1998年只有大约240万个网站,而现在已经有大约18亿个了,这正好是74900%的增长.不仅如此,互联网用户的数量也从1998年的1 ...

  7. 系统上线发布清单_跨浏览器测试清单上线之前

    系统上线发布清单 This article was originally published on LambdaTest. Thank you for supporting the partners ...

  8. html 引入js 兼容,JS跨浏览器兼容性解决思路及方案汇总,常见JS兼容性知识点汇总...

    上篇文章我们介绍了,处理CSS浏览器兼容性的4个解决方案:浏览器CSS样式初始化.浏览器私有属性,CSS hack语法和自动化插件,有兴趣的可以看看,链接放到本文结尾 本文主要介绍JS的跨浏览器兼容性 ...

  9. js ajax 浏览器兼容,JS跨浏览器兼容,一点点总结

    不同的浏览器,对不同的/相同的属性.方法等的支持程度也会有所差别,要想达到满意的效果,需要做一些处理.给不同的浏览器量体裁衣,也就是所说的达到兼容. 常见的处理方式:(能力检测和浏览器检测) 1.三目 ...

  10. XML4跨浏览器兼容

    //跨浏览器返回XMLDOM对象 function getXMLDOM(xmlStr){ var xmlDom=null; if(typeof window.DOMParser !='undefine ...

最新文章

  1. 经典!工业界深度推荐系统与CTR预估必读的论文汇总
  2. java 自动封装_自动补全的java封装
  3. 3.程序的局部性原理
  4. applicationSettings设置和appsttings
  5. 初试Windows 8 RTM
  6. java框架----commonmark的使用(一)
  7. SparkSQL之DataFrame案例
  8. 看到了一个 蒙特卡洛方法 随机数得出 圆周率的c++ 源码
  9. MySQL安装 - Linux7下. rpm方式安装
  10. vss团队开发工具使用(个人学习心得)
  11. ligerui_ligerTree_005_动态增加“树”节点
  12. Became Jane(成为简.奥斯丁)
  13. ubuntu wps缺少字体_一个字体:系统风汜霰狮尾黑
  14. 大数据面试求职经验总结
  15. python数据可视化第三方库有哪些_数据可视化!看看程序员大佬都推荐的几大Python库...
  16. BZOJ3881 Coci2015 Divljak fail树+差分
  17. 长路漫漫,唯剑作伴--基础
  18. 【毕设】requests+bs4+re 爬取知网文献来源的信息
  19. 软件项目管理 3.2.预测生存期模型
  20. MySQL的索引原理,索引的类型有哪些,如何创建合理的索引,索引如何优化。

热门文章

  1. c语言把数字转换为字母,C语言将字符串转数字
  2. web前端小故事(浏览器大战)
  3. 45_局域网ip正则表达式
  4. 数论入门(基础定义)
  5. Python实现超像素分割
  6. 三菱FX3U-485ADP-MB通讯三种变频器程序
  7. 交叉小波分析matlab,[转载]Matlab 小波分析及物理含义
  8. python去噪函数_Python | 简单的扩音,音频去噪,静音剪切
  9. AI 机器视觉/计算机视觉系统在行业中的应用
  10. mysql中如何批量删除冗余数据库_WordPress清理数据库中的冗余数据加速网站运行速度...