onclick与addEventListener区别

onclick与addEventListener区别这次做项目遇到了这个问题,本来习惯性的每次都写的是addEventListener绑定click事件。但是当用addEventListener绑定了多次click事件的时候,引发了我的思考,这两者有区别吗?具体的事件分析可查看另一篇文章结论:1.onclick事件在同一时间只能指向唯一对象2.addEventListener给一个事件注册多个listener3.addEventLi…

大家好,又见面了,我是你们的朋友全栈君。

这次做项目遇到了这个问题,本来习惯性的每次都写的是addEventListener绑定click事件。但是当用addEventListener绑定了多次click事件的时候,引发了我的思考,这两者有区别吗?具体的事件分析可查看另一篇文章

结论:

1.onclick事件在同一时间只能指向唯一对象

2.addEventListener给一个事件注册多个listener

3.addEventListener对任何DOM都是有效的,而onclick仅限于HTML

4.addEventListener可以控制listener的触发阶段,(捕获/冒泡)。对于多个相同的事件处理器,不会重复触发,不需要手动使用removeEventListener清除

5.IE9使用attachEvent和detachEvent

探究:

onclick添加事件:

element.onclick = functionRef;

functionRef是一个函数,通常是在别处声明的函数名,或者是一个函数表达式

onclick删除事件:

element.onclick = null;

onclick与addEventListener区别

DOM格式如上,javascript代码

onclick与addEventListener区别

运行结果:

可想而知,只会弹出一个弹出框,虽然绑定了两次,‘我是click2’

一个click处理器在同一时间只能指向唯一的对象。因此就算对于一个对象绑定了多次,但是仍然只会出现最后的一次绑定。

addEventlistener绑定click事件:

currentTarget.addEventListener(type, listener, option)

同样上面的DOM结构,对应的javascript代码:

onclick与addEventListener区别

运行结果:

两次绑定的事件,都能够成功运行,也就是前后弹出 ‘我是addEvent1’ ‘我是addEvent2’

由此可知,对于一个可以绑定的事件对象,想多次绑定事件都能运行,选用addEventListener

通过addEventListener添加的事件必须通过相对应的为removeListener注销事件。但是如果像上面的用匿名函数的方式注册的事件,不能使用removeListener注销,因为没用对应事件的引用。

所以注册事件如果需要取消,最好使用一个引用,即:

var eventName = function () {
    //something
};

也正是这种方式,对于一个对象多次绑定同样的eventName,那么不会重复执行,只会执行一次。对于上面的匿名函数,就算内容一样,也会依次执行,因为并不能算是相同事件处理器

里面的this引用,不是window对象,而是触发事件的元素的引用。

对于IE9之前,相对应的是attachEvent和detachEvent

总结:

1.onclick事件在同一时间只能指向唯一对象

2.addEventListener给一个事件注册多个listener

3.addEventListener对任何DOM都是有效的,而onclick仅限于HTML

4.addEventListener可以控制listener的触发阶段,(捕获/冒泡)。对于多个相同的事件处理器,不会重复触发,不需要手动使用removeEventListener清除

5.IE9使用attachEvent和detachEvent

参考文献:

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158284.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Redis分布式锁的正确实现方式(Java版)

    Redis分布式锁的正确实现方式(Java版)https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/https://blog.csdn.net/l_bestcoder/article/details/79336986一、什么是分布式锁?要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,…

    2022年6月4日
    39
  • 双向 LSTM

    双向 LSTM本文结构:为什么用双向LSTM什么是双向LSTM例子为什么用双向LSTM?单向的RNN,是根据前面的信息推出后面的,但有时候只看前面的词是不够的,例如,我今天不舒服,我打算__一天。只根据‘不舒服‘,可能推出我打算‘去医院‘,‘睡觉‘,‘请假‘等等,但如果加上后面的‘一天‘,能选择的范围就变小了,‘去医院‘这种就不能选了,而‘请假‘‘休息‘之类的被选择概率就会更大。什么是双向L

    2022年6月15日
    76
  • tabnine 激活码【2021.7最新】

    (tabnine 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlKUKQYKZ5XE-eyJsaWNlbnNlSW…

    2022年3月22日
    154
  • JS实现倒计时代码实例「建议收藏」

    varcount=60*15;varcountdown=setInterval(CountDown,1000);functionCountDown(){if(count>=0){varminutes=Math.floor(count/60);varseconds=Math.floor(count…

    2022年4月13日
    46
  • 通过因果图法来写测试用例的步骤_通过因果图写测试用例的步骤

    通过因果图法来写测试用例的步骤_通过因果图写测试用例的步骤一、应用场合在一个界面中,有多个控件,测试的时候要考虑控件的组合关系,不同的控件组合会产生不同的输出结果的组合,为了弄清什么样的输入组合会产生什么样的输出组合,使用因果图法。二、因果图核心1、因——原因,输入条件2、果——结果,输出结果使用图形的方式,分析软件输入和输出的对应关系三、图形符号1、基本图形表示输入和输出的对应关系(1)恒等(=)…

    2022年8月14日
    7
  • 初次使用cocoapods注意事项「建议收藏」

    初次使用cocoapods注意事项

    2022年2月1日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号