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中面向对象技术的模拟
Sep 25 Javascript
JavaScript语句可以不以;结尾的烦恼
Mar 08 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
Feb 13 Javascript
javascript中setInterval的用法
Jul 19 Javascript
javascript原型继承工作原理和实例详解
Apr 07 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
May 17 Javascript
jQuery的层级查找方式分析
Jun 16 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
Sep 15 Javascript
关于webpack2和模块打包的新手指南(小结)
Aug 07 Javascript
浅谈Vue初学之props的驼峰命名
Jul 19 Javascript
微信小程序如何实现radio单选框单击打勾和取消
Jan 21 Javascript
JavaScript原型链详解
Nov 07 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
MySQL时间字段究竟使用INT还是DateTime的说明
2012/02/27 PHP
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
PHP 中使用explode()函数切割字符串为数组的示例
2017/05/06 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
php获得刚插入数据的id 的几种方法总结
2018/05/31 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
select组合框option的捕捉实例代码
2008/09/30 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
基于jquery自定义的漂亮单选按钮RadioButton
2013/11/19 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
vue实现列表拖拽排序的功能
2020/11/02 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
Python制作简易注册登录系统
2016/12/15 Python
python实现逻辑回归的方法示例
2017/05/02 Python
python进行TCP端口扫描的实现
2018/12/21 Python
python实现简单银行管理系统
2019/10/25 Python
Python 下载及安装详细步骤
2019/11/04 Python
python 如何读、写、解析CSV文件
2021/03/03 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
护士节演讲稿开场白
2014/08/25 职场文书
交通局领导班子群众路线教育实践活动对照检查材料思想汇报
2014/10/09 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
如何写辞职书
2015/02/26 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android