1. onclick事件 es5

普通事件就是直接触发事件,相同的事件会被覆盖掉。代码如下:

let demoDiv=document.querySelector(".demo")
demoDiv.onclick = function(){
console.log('你好1')
}
demoDiv.onclick = function(){
console.log('你好2')
}
demoDiv.ondblclick = function(){
console.log('你好3')
}
输出的结果只会有<你好2>, <你好3>
就是说相同的事件绑定同一个元素会出现覆盖; ps:双击的时候,默认会触发单击事件;

2. addEventListener事件 es6

addEventListener进行多次绑定相同的事件都能运行。不会出现事件覆盖

let demoDiv=document.querySelector(".demo")
demoDiv.addEventListener("click",function(){
console.log("点击111");
},false); demoDiv.addEventListener("click",function(){
console.log("点击222");
},false); 最后会出现【点击111】和【点击222】

3.兼容性

浏览器的兼容性
ie9 以前:使用attachEvent/detachEvent进行绑定 ie9 开始:使用addEventListener进行绑定

4. 二者区别

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

addEventListener可以控制listener的触发阶段,(捕获/冒泡)。
对于多个相同的事件处理器,不会重复触发,不需要手动使用removeEventListener清除。 总的来说:事件绑定是指把事件注册到具体的元素之上,普通事件指的是可以用来注册的事件

5. 移除 addEventListener事件

addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作。
们都接受3个参数:如 addEventListener("事件名" , "事件处理函数" , "布尔值");
听别人说:现在的版本可以省略第三个参数,默认值为false 通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;
同时需要注意的是通过addEventListener()添加的匿名函数无法移除

6.错误的移除方法

<body>
<div class="demo">点击我</div>
</body>
<script>
let demoDiv = document.querySelector(".demo"); demoDiv.addEventListener("click", function () {
console.log("点击111");
}, false); demoDiv.removeEventListener('click', function (event) {
event.preventDefault();
}, false);
</script> ps:通过addEventListener()添加的匿名函数无法移除 特别重要:这个例子中,
使用addEventListener()添加一个事件处理程序。
虽然调用removeEventListener()
是看似使用了相同的参数,但实际上,
第二个参数与传入addEventListener()中的那一个完全不同的函数。
而传入removeEventListener()中的事件处理程序函数必须与传addEventListener()中的相同

7. 错误的用法

<body>
<div class="demo">点击我</div>
</body>
<script>
let demoDiv = document.querySelector(".demo"); function clickMy(event) {
console.log("点击了我111");
}
//页面渲染完成就触发了调用函数,这是错误的用法
demoDiv.addEventListener("click", clickMy(), false); demoDiv.removeEventListener('click', clickMy(), false);
</script>

8.正确的移除方法

<body>
<div class="demo">点击我</div>
</body>
<script>
let demoDiv = document.querySelector(".demo"); function clickMy() {
console.log("点击了我111");
}
demoDiv.addEventListener("click", clickMy, false); // 10s后这个事件将会被移除,没有直接去调用,没有括号
setTimeout(() => {
demoDiv.removeEventListener('click', clickMy, false);
}, 10000)
</script>
//这样移除的跟传入的就是同一个函数了

9.addEventListener()与removeEventListener()的第三个参数详解


布尔值参数是true,表示事件捕获
就是最不具体的节点先接收事件,
最具体的节点最后接收事件
(我们可以理解为;点击一个具体的元素,先触发顶级的节点,
然后向下进行传递,知道被点击的那个具体元素)
true捕获,false冒泡 如果是false,
开启事件冒泡
则是先寻找【具体指定的位置】由【最具体的元素】接收,
然后【逐级向上传播】至最不具体的元素的节点(或者说顶级节点)(文档)

10.开启冒泡

<body>
<div id="out">
<p>我没有用,我只占位</p>
<div id="middle">
<div id="inner">最里面</div>
</div>
</div>
</body>
<script>
var out = document.getElementById('out');
var middle = document.getElementById('middle');
var inner = document.getElementById('inner'); //点击inner时,触发顺序为:inner-------middle------out
// 因为第三个参数是false,开启了事件冒泡
out.addEventListener('click', function () {
alert("我是最外面的");
}, false); middle.addEventListener('click', function () {
alert("我是中间的");
}, false); inner.addEventListener('click', function () {
alert("我是最里面的");
}, false);
</script>

11.开启捕获

<body>
<div id="out">
<p>我没有用,我只占位</p>
<div id="middle">
<div id="inner">最里面</div>
</div>
</div>
</body>
<script>
var out = document.getElementById('out');
var middle = document.getElementById('middle');
var inner = document.getElementById('inner'); //点击inner时,触发顺序为:out -------middle------inner
// 因为第三个参数是true开启了捕获
out.addEventListener('click', function () {
alert("我是最外面的");
}, true); middle.addEventListener('click', function () {
alert("我是中间的");
}, true); inner.addEventListener('click', function () {
alert("我是最里面的");
}, true);
</script>

12.得出结论


<body>
<div id="out">
<p>我没有用,我只占位</p>
<div id="middle">
<div id="inner">最里面</div>
</div>
</div>
</body>
<script>
var out = document.getElementById('out');
var middle = document.getElementById('middle');
var inner = document.getElementById('inner'); //点击inner时,触发顺序为:out------inner-------middle
out.addEventListener('click', function () {
alert("我是最外面的");
}, true); middle.addEventListener('click', function () {
alert("我是中间的");
}, false); inner.addEventListener('click', function () {
alert("我是最里面的");
}, false); // 结论:
// 第一条结论:true的触发顺序总是在false前面
// 第二条结论:如果多个均为true 则外层触发先于内层; 因为true是捕获,所以先触发外层
// 第三条结论:如果多个均为false 则内层触发先于外层 因为false是冒泡,所以先触发内层 </script>

文章参考的地址有:https://blog.csdn.net/gabby____/article/details/81812064

click与addEventListener和removeEventListener事件与移除正确的移除事件详解的更多相关文章

  1. 27.28. VUE学习之--事件修饰符之stop&capture&self&once实例详解

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. (转)addEventListener()与removeEventListener()详解

    转自:http://www.111cn.net/wy/js-ajax/48004.htm addEventListener()与removeEventListener()用于处理指定和删除事件处理程序 ...

  3. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  4. 事件监听addEventListener()和removeEventListener() ---------1

    一直想写一个原生事件监听的记录,方便以后看,不愿意写主要是事件监听的单词太长,记起来好难记每次都要查,这次把知道的写完了,来这里查好了,以后要是理解的更透彻了,就再补全好了 首先,DOM0级事件和DO ...

  5. js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

    js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener( ...

  6. addEventListener()与removeEventListener(),追加事件和删除追加事件

    addEventListener()与removeEventListener()用于追加事件和删除追加.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件处理程序的函 ...

  7. 封装兼容性添加、删除事件的函数 addEventListener与removeEventListener

    var Event = { addHandler: function (oElement, sEvent, fnHandler) { oElement.addEventListener ? oElem ...

  8. JS添加事件和解绑事件:addEventListener()与removeEventListener()

    作用: addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作. 它们都接受3个参数:事件名.事件处理的函数和布尔值. 布尔值参数是true ...

  9. 兼容8事件绑定与解绑addEventListener、removeEventListener和ie的attachEvent、detachEvent

    兼容8事件绑定与解绑addEventListener.removeEventListener和ie的attachEvent.detachEvent   ;(function(){ // 事件绑定 bi ...

  10. javascript -- addEventListener()和removeEventListener

    addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件 ...

随机推荐

  1. [ERROR] Error executing Maven. [ERROR] 1 problem was encountered while building the effective settings

    原因: maven 的配置文件 setting.xml 有错. 比如在配置文件中多了一行: 导致配置文件的格式不正确.

  2. VMware NAT 模式 虚拟机网络电缆被拔出,连不上网

    检查服务 VMnetDHCP,VMware NAT Service 服务是否已启动,启动后可以正常使用网络

  3. Dom4j 保存XML HL7-V3

    dom4j selectNodes 取不到值 因为XML带有命名空间 HL7 Dom4j 保存XML String xmlPath = "D:\\BS004.xml"; Strin ...

  4. Hugging News #0609: 最新代码生成模型 StarCoder+ 和 StarChat Beta 重磅发布!

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  5. flask自定义参数校验、序列化和反序列化

    项目总体结构 我的工厂函数factory.py from settings import setting from flask import Flask from models.models impo ...

  6. 【每日一题】40. 旅游 (树形DP解决树的最大独立集)

    补题链接:Here 算法涉及:树形DP寻找树上最大独立集 一开始想到是利用 树形DP 找树的直径问题,但这里由于可以利用走过的点衍生,所以不符合树的直径问题 查询了一下资料这道题是属于: 树的最大独立 ...

  7. freeswitch的mod_xml_curl模块动态获取configuration

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. mod_xml_curl模块支持从web服务获取xml配置,本文介绍如何动态获取acl配置. 环境 centos:CentOS  r ...

  8. C++ 覆盖写文件

    写文件有三种模式: 截断写,文件打开之后立即清空原有内容 附加写,文件打开之后不清空原有内容,每次只能在文件最后写入 覆盖写,文件打开之后不清空原有内容,可以在文件任意位置写入 例如:文件原有内容为 ...

  9. JUC包常用类原理

    放眼望去,java.util.concurrent包下类大致包括:atomic 原子类.锁.并发集合.线程池.工具类.我们挑重要的了解一下. Atomic 原子类 Java针对并发编程已经有了各种锁, ...

  10. Tmux | 常用操作存档

    (因为自己实在是太好忘了,所以在博客存档方便查找) 参考资料:Tmux 使用教程 | 阮一峰的网络日志 tmux new -s <session-name> <Ctrl+B D> ...