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 相关文章推荐
二级域名转向类
Nov 09 Javascript
jquery eval解析JSON中的注意点介绍
Aug 23 Javascript
js中通过split函数分割字符串成数组小例子
Sep 21 Javascript
JS将表单导出成EXCEL的实例代码
Nov 11 Javascript
javascript里使用php代码实例
Dec 13 Javascript
jQuery中extend函数的实现原理详解
Feb 03 Javascript
TypeOf这些知识点你了解吗
Feb 21 Javascript
JS监控关闭浏览器操作的实例详解
Sep 12 Javascript
给vue项目添加ESLint的详细步骤
Sep 29 Javascript
JS实现移动端点击按钮复制文本内容
Jul 28 Javascript
JS实现json数组排序操作实例分析
Oct 28 Javascript
微信小程序新闻网站详情页实例代码
Jan 10 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
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
Python实现多线程下载文件的代码实例
2014/06/01 Python
Python3基础之基本数据类型概述
2014/08/13 Python
Python中实现结构相似的函数调用方法
2015/03/10 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
Python 多线程抓取图片效率对比
2016/02/27 Python
Django 添加静态文件的两种实现方法(必看篇)
2017/07/14 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
.net工程师笔试题
2012/06/09 面试题
采购主管岗位职责
2014/02/01 职场文书
小学生寒假家长评语
2014/04/16 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
给numpy.array增加维度的超简单方法
2021/06/02 Python
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android