浅谈addEventListener和attachEvent的区别


Posted in Javascript onJuly 14, 2016

• addEventListener共有3个参数,如下所示:

element.addEventListener(type,listener,useCapture);

参数 参数说明
element 要绑定事件的对象,及HTML节点。
type 事件名称,注意去掉事件前边的“on”,比如“onclick”要写成“click”,“onmouseover”要写成“mouseover”。
listener 要绑定的事件监听函数,注意只写函数名,不要带括号。
userCapture 事件监听方式,只能是true和false:true,采用capture(捕获)模式;false,采用bubbling(冒泡)模式。如无特殊要求,一般是false。

这里有必要说一下捕获模式和冒泡模式的区别。

浅谈addEventListener和attachEvent的区别

如图所示,有两层div元素,而且都设定有click事件,一般来说,如果我在内层蓝色的元素上click不只会触发蓝色元素的click事件,还会同时触发红色元素的click事件,而useCapture这个参数就是在控制这时候两个click事件的先后顺序。如果是false,那就会使用bubbling(冒泡)模式,他是从内而外的流程,所以会先执行蓝色元素的click事件再执行红色元素的click事件,如果是true,那就是capture(捕获)模式,和bubbling(冒泡)模式相反是由外而内,会先执行红色元素的click事件才执行蓝色元素的click事件。

如果不同层的元素使用的useCapture不同,会先从最外层元素往目标元素寻找设定为capture(捕获)模式的事件,到达目标元素执行目标元素的事件后,再寻原路往外寻找设定为bubbling(冒泡)模式的事件。

•attachEvent共有2个参数,如下所示:

element.attachEvent(type,listener);

参数 参数说明
element 要绑定事件的对象,及HTML节点。
type 事件名称,注意加上事件前边的“on”,比如“onclick”和“onmouseover”,这是与addEventListener的区别。
listener 要绑定的事件监听函数,注意只写函数名,不要带括号。

addEventListener()是标准的绑定事件监听函数的方法,是W3C所支持的,Chrome、FireFox、Opera、Safari、IE9.0及其以上版本都支持该函数;但是,IE8.0及其以下版本不支持该方法,它使用attachEvent()来绑定事件监听函数。所以,这种绑定事件的方法必须要处理浏览器兼容问题。

兼容IE和非IE浏览器事件绑定的代码:

function addEvent(obj,type,handle){
  try{ // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本
    obj.addEventListener(type,handle,false);
  }catch(e){
    try{ // IE8.0及其以下版本
      obj.attachEvent('on' + type,handle);
    }catch(e){ // 早期浏览器
      obj['on' + type] = handle;
    }
  }
}

或者

function regEvent(ele, event_name, fun)
{
  if (window.attachEvent) 
    ele.attachEvent(event_name, fun); //IE浏览器
  else
  {
    event_name = event_name.replace(/^on/, “”);  //如果on开头,删除on,如onclick->click
    ele.addEventListener(event_name, fun, false); //非IE浏览器
  }
}

以上这篇浅谈addEventListener和attachEvent的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现点击注册按钮开始读秒倒计时的小例子
May 11 Javascript
jQuery实现可收缩展开的级联菜单实例代码
Nov 27 Javascript
用javascript替换URL中的参数值示例代码
Jan 27 Javascript
用C/C++来实现 Node.js 的模块(一)
Sep 24 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
May 04 Javascript
jQuery插件formValidator实现表单验证
May 23 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
Sep 10 Javascript
vue自定义全局组件(自定义插件)的用法
Jan 30 Javascript
Bootstrap实现省市区三级联动(亲测可用)
Jul 26 Javascript
基于axios 的responseType类型的设置方法
Oct 29 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 #Javascript
全面了解addEventListener和on的区别
Jul 14 #Javascript
js计算系统当前日期是星期几的方法
Jul 14 #Javascript
原生javascript 学习之js变量全面了解
Jul 14 #Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
Jul 14 #Javascript
AngularJS实用开发技巧(推荐)
Jul 13 #Javascript
JS中如何比较两个Json对象是否相等实例代码
Jul 13 #Javascript
You might like
用PHP生成html分页列表的代码
2007/03/18 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
JS打字效果的动态菜单代码分享
2015/08/21 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
JavaScript的变量声明提升问题浅析(Hoisting)
2016/11/30 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
vue实现通讯录功能
2018/07/14 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
Vue如何循环提取对象数组中的值
2020/11/18 Vue.js
python私有属性和方法实例分析
2015/01/15 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
详解Python发送email的三种方式
2018/10/18 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
奇怪的鱼:Weird Fish
2018/03/18 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
竞争上岗演讲稿
2014/01/05 职场文书
魅力教师事迹材料
2014/01/10 职场文书
运动会广播稿200米
2014/01/27 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
公司节能减排方案
2014/05/16 职场文书
国贸专业求职信
2014/06/28 职场文书
金融管理专业求职信
2014/07/10 职场文书
创业计划书之废品回收
2019/09/26 职场文书
Java 定时任务技术趋势简介
2022/05/04 Java/Android