首先说一下addEventListener
  • 语法:
    element.addEventListener(event, function, useCapture)
  • 这里的event是事件名,function是相应的事件,这个useCapture是一个布尔值,默认是false,就是说在冒泡阶段执行,如果为true,就在捕获阶段执行
  • 利用addEventListener可以简单复现网页中对一个对一个元素操作之后从window-->document-->html-->body-->...-->目标元素的捕获,然后反过来冒泡的过程
  • addEventListener 是DOM2版本中加入的
绑定事件有几种方式
  • Event Listeners (包含addEventListener和IE的attachEvent)

    • IE 8 以及更低版本的 IE 中,需要用 attachEvent 方法:
    element.attachEvent('onclick', function() { /* do stuff here*/ });
    • 对于 IE 9 和更高版本的 IE,以及其它浏览器,则要用 addEventListener 方法:
    element.addEventListener('click', function() { /* do stuff here*/ }, false);

    用上面这种方法(DOM level 2 events),理论上可以为一个元素绑定无数个事件,实际应用中则决定于客户端的电脑内存以及浏览器。

  • Inline Events
    • HTML 的 onclick="" 属性,以及 element.onclick
    • 在所有支持 JavaScript 的浏览器中,可以用下面的方式来添加内联的事件监听器。
    <a id="testing" href="#" onclick="alert('did stuff inline');">Click me</a>
    • 还有另一种方法
    element.onclick = function () { /*do stuff here */ };
两种方案的区别:

要回答这个问题,就要考虑各个浏览器的兼容性,以及实际需求了。即使现在只需要为一个元素绑定一个事件,但是以后很可能还要同时再绑定别的事件,这个时候,就需要用 attachEvent 和 addEventListener 了,否则用内联方法就可以搞定了。

jQuery 以及其它的 JavaScript 框架,已经将各个浏览器的 DOM level 2 events 的实现以通用模型的形式封装起来了,所以通过 jQuery 可以很方便地写出适用于所有浏览器的代码:

$(element).on('click', function () { /* do stuff */ });

他们之间最大的区别就是addEventListener可以为一个元素绑定多个事件,即它允许给一个事件注册多个监听器,而onclik只能给元素注册一个,如果存在多个,则后面的事件会覆盖前面的

<ul id="color-list">
<li id="addEvent">red</li>
<li id="on_click">yellow</li>
</ul>
<script type="text/javascript">
(function(){
var addEvent = document.getElementById("addEvent");
addEvent.addEventListener("click",function(){
alert("我是addEvent1");
},false);
addEvent.addEventListener("click",function(){
alert("我是addEvent2");
},false); var addEvent = document.getElementById("on_click"); on_click.onclick = function() {
alert("我是click1");
}
on_click.onclick = function() {
alert("我是click2");
}
})();
</script>

在这个例子中,red点击之后会分别弹出我是addEvent1和我是addEvent2,而yellow点击之后只会弹出我是click2。

一个适用于所有浏览器的事件监听器函数
function addEventFn (ele, event, func) {
if(ele.attachEvent) { //IE8及更低版本的浏览器
return ele.attachEvent('on'+event, func);
}
else { //IE8及以上浏览器,默认冒泡阶段
return ele.addEventListener(event, func, false);
}
}
// 调用示例
addEventFn(
document.getElementById("addEvent"),
'click',
function () {alert('red')}
)

参考文章:

addEventListener 和 onclick 简单比较的更多相关文章

  1. addEventListener、onclick和jquery的bind()、click()

    addEventListener("click",function(event){},false); removeEventListener("click",f ...

  2. addEventListener和onclick的区别

    onclick只出现一次alert:我是click2[很正常第一次click事件会被第二次所覆盖],但是addEventListener却可以先后运行,不会被覆盖[正如:它允许给一个事件注册多个监听器 ...

  3. JS核心系列:浅谈 call apply 与 bind

    在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...

  4. 4类 JavaScript 内存泄露及如何避免

    原文:4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them笔记:涂鸦码龙 译者注:本文并没有逐字逐句的翻译,而是把我认为重要 ...

  5. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  6. JS内存泄漏 和Chrome 内存分析工具简介(摘)

    原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱   原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - AR ...

  7. JS线程模型&Web Worker

    js线程模型 客户端javascript是单线程,浏览器无法同时运行两个事件处理程序 设计为单线程的理论是,客户端的javascript函数必须不能运行太长时间,否则会导致web浏览器无法对用户输入做 ...

  8. [Mugeda HTML5技术教程之14]案例分析:制作网页游戏

    本文档要分析的案例是一个爱消除的网页小游戏,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作网页游戏的方法. (一)游戏规则: 1.开始游戏时,手机出现在最上面一行的任意一格: 2 ...

  9. 事件轮询中的task与microtask

    event loop 网上看到的一篇文章,关于介绍task和Tasks, microtasks, queues and schedules,尝试简单翻译一下写进来吧! 原文地址:https://jak ...

随机推荐

  1. PL/SQL 创建用户及权限操作

    1.创建User create user user01 identified by user01, 2.赋予连接数据库的权限 grant connect to user01; 3.把user00的表E ...

  2. MySql—模糊查询

    实例: SQL模糊查询,使用like比较关键字,加上SQL里的通配符,请参考以下:  1.LIKE 'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden).  2.LIKE '%in ...

  3. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) D - Dynamic Problem Scoring

    地址:http://codeforces.com/contest/807/problem/D 题目: D. Dynamic Problem Scoring time limit per test 2 ...

  4. OpenStack的架构详解

    OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云.小云提供可扩展的.灵活的 ...

  5. 【android】夜间模式简单实现

    完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 关于阅读类的app,有个夜间模式真是太重要了. 那么有两种方式可以实现夜间模式 1: ...

  6. spring boot 使用属性加载顺序

    1.命令行中传入的参数 2.SPRING_APPLICATION_JSON中的属性.SPRING_APPLICATION_JSON是以JSON格式配置再系统环境变量中的内容 3.java:comp/e ...

  7. zookeeper curator客户端之增删改查

    zookeeper curator客户端之增删改查 zookeeper安装:https://www.cnblogs.com/zwcry/p/10272506.html curator客户端是Apach ...

  8. 注意:PHP7中十个需要避免的坑

    1.不要使用mysql_函数 这一天终于来了,从此你不仅仅“不应该”使用mysql_函数.PHP7已经把它们从核心中全部移除了,也就是说你需要迁移到好得多的mysqli_函数,或者更灵活的PDO实现. ...

  9. ubuntu18.04 64bit如何安装docker

    注:参考自https://docs.docker.com/install/linux/docker-ce/ubuntu/ 1.卸载旧版本docker(如果之前安装了) sudo apt-get rem ...

  10. xstream中几个注解的含义和用法(转)

    XStream是个很强大的工具,能将Java对象和xml之间相互转化.xstream不在意java类中成员变量是私有还是公有,也不在乎是否有默认构造函数.它调用方式也非常简单:从xml对象转化为jav ...