addEventListener()和removeEventListener()追加事件和删除追加事件


Posted in Javascript onDecember 04, 2020

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

最后这个布尔值参数是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。默认为false;

要在按钮上为click事件添加事件处理程序,可以使用下列代码:

1 var btn = document.getElementById("myBtn");
2 btn.addEventListener("click", function () {
3  alert(this.id);
4 }, false);

使用DOM2级方法添加事件处理程序的主要好处是可以添加多个事件处理程序。来看下面的例子:

var btn = document.getElementById("myBtn");
btn.addEventListener("click", function () {
 alert(this.id);
}, false);
btn.addEventListener("click", function () {
 alert("Hello World");
}, false);

通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;移除时传入的参数与添加处理程序时使用的参数相同。这也意味着通过addEventListener()添加的匿名函数无法移除,如下面的例子所示:

var btn = document.getElementById("myBtn");
btn.addEventListener("click", function () {
 alert(this.id);
}, false);
btn.removeEventListener("click", function () { //无效!
 alert(this.id);
}, false);

在这个例子中,removeEventListener无法删除addEventListener所追加的事件,因为两个方法并不相等,内存地址已经是不同的,如下面的例子所示:

var btn = document.getElementById("myBtn");
var handler = function () {
  alert(this.id);
 };
btn.addEventListener("click", handler, false);
btn.removeEventListener("click", handler, false); //有效!

重写后的这个例子没有问题,是因为在addEventListener()和removeEventListener()中用来相同的函数。

大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这样可以最大限度地兼容各种浏览器。最好只在需要在是时间到达目标之前截获它的时候将事件处理程序添加到捕获阶段。如果不是特别需要,我们不建议在事件捕获阶段注册事件处理程序;

亲测:

方法的内存地址十分的重要,一定要相同才可以删除;试过遇到的坑:

var clickFun = null;
aa = function(){
 clickFun = function(){
  alert("1")
 }
 window.removeEventListener("click",clickFun,false)
 window.addEventListener("click",clickFun,false)
}
setInterval(function(){
 aa()
},2000)

需求,需要不断地往一个function里面塞数据,里面会有追加,如果不删除了话,会一直追加上去,不环保并且耗内存,必须要删掉追加;然而像上面这样写的话,由于removeEventListener和addEventListener里面的clickFun内存不相等,导致删除不成功;调整如下:

var clickFun = null;
aa = function(){
 !clickFun && (window.removeEventListener("click",clickFun,false));
 clickFun = function(){
  alert("1")
 }
 window.addEventListener("click",clickFun,false)
}
setInterval(function(){
 aa()
},2000)

确保删除的是同一个内存的方法

到此这篇关于addEventListener()和removeEventListener()追加事件和删除追加事件的文章就介绍到这了,更多相关addEventListener()和removeEventListener()追加事件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Javascript 面向对象编程(coolshell)
Mar 18 Javascript
input禁止键盘及中文输入,但可以点击
Feb 13 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
Mar 05 Javascript
js实现人民币大写金额形式转换
Apr 27 Javascript
非常实用的js验证框架实现源码 附原理方法
Jun 08 Javascript
AngularJS国际化详解及示例代码
Aug 18 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
Sep 20 Javascript
实例解析jQuery工具函数
Dec 01 Javascript
基于JavaScript实现百度搜索框效果
Jun 28 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
Feb 26 Javascript
详解React中setState回调函数
Jun 14 Javascript
vue项目或网页上实现文字转换成语音播放功能
Jun 09 Javascript
vue使用echarts图表自适应的几种解决方案
Dec 04 #Vue.js
原生JS实现拖拽效果
Dec 04 #Javascript
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 #Vue.js
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 #Vue.js
JS如何监听div的resize事件详解
Dec 03 #Javascript
JavaScript十大取整方法实例教程
Dec 03 #Javascript
js实现圆形菜单选择器
Dec 03 #Javascript
You might like
咖啡知识大全
2021/03/03 新手入门
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
PHP进阶学习之反射基本概念与用法分析
2019/06/18 PHP
js简单实现让文本框内容逐个字的显示出来
2013/10/22 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
基于vue-cli 打包时抽离项目相关配置文件详解
2018/03/07 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
js实现百度淘宝搜索功能
2020/02/17 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python中利用Future对象回调别的函数示例代码
2017/09/07 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
python调用函数、类和文件操作简单实例总结
2019/11/29 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
大四学年自我鉴定
2013/11/13 职场文书
学年自我鉴定
2014/01/16 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
公司岗位说明书
2015/10/08 职场文书
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis