浅谈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 相关文章推荐
Javascript中return的使用与闭包详解
Jan 11 Javascript
JS轮播图中缓动函数的封装
Nov 25 Javascript
深入浅析JavaScript中的RegExp对象
Sep 18 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
Nov 29 Javascript
vue 之 .sync 修饰符示例详解
Apr 21 Javascript
微信小程序登录换取token的教程
May 31 Javascript
Vue实现底部侧边工具栏的实例代码
Sep 03 Javascript
原生JS实现的放大镜特效示例【测试可用】
Dec 08 Javascript
Angular2 自定义表单验证器的实现方法
Dec 14 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
Oct 14 Javascript
jQuery实时统计输入框字数及限制
Jun 24 jQuery
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 Session变量不能传送到下一页的解决方法
2009/11/27 PHP
php 如何获取数组第一个值
2013/08/06 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
PHP类的封装与继承详解
2015/09/29 PHP
php实现数据库的增删改查
2017/02/26 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
JavaScript中的Window窗口对象
2008/01/16 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
jQuery .tmpl() 用法示例介绍
2014/08/21 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
基于bootstrap写的一点localStorage本地储存
2017/11/21 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
python中pika模块问题的深入探究
2018/10/13 Python
Python数据存储之 h5py详解
2019/12/26 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
详解如何修改python中字典的键和值
2020/09/29 Python
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
接口可以包含哪些成员
2012/09/30 面试题
优秀小学生家长评语
2014/01/30 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
质量在我心中演讲稿
2014/09/02 职场文书
师德标兵事迹材料
2014/12/19 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫
Linux中各个目录的作用与内容
2022/06/28 Servers