addEventListener()与removeEventListener()解析


Posted in Javascript onApril 20, 2017

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

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

addEventListener的参数一共有三个,语法为:
element.addEventListener(type,listener,useCapture)

下面是详解:
1、其中element是要绑定函数的对象。
2、type是事件名称,要注意的是"onclick"要改为"click","onblur"要改为"blur",也就是说事件名不要带"on"。
3、listener当然就是绑定的函数了,记住不要跟括号
4、最后一个参数是个布尔值,表示该事件的响应顺序,下面重点介绍一下addEventListener的第3个参数(useCapture)。

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

var btn = document.getElementById("myBtn");
btn.addEventListener("click", function () {
  alert(this.id);
}, 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);

在这个例子中,我使用addEventListener()添加一个事件处理程序。
虽然调用removeEventListener看似使用了相同的参数
但实际上,第二个参数与传入addEventListener()中的是完全不同的函数。
而传入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()中用来相同的函数。
实验结果是,用户点击button时,每次都会输出"I have been clicked!",说明removeEventListener()函数没有起到作用。 

通过查找资料,得出结论。在使用removeEventListener()函数时,handler函数,必须和使用addEventListener()里面的handler函数必须相同。

所以上面写的代码是错误的。修正之后的代码应该如下:

//addEventListener()和removeEventListener()中handler函数必须相同,移除事件函数才有效。
function myhandler(){
  console.log("I have been clicked!");
  document.getElementById('info').removeEventListener('click',myhandler,false);
}
var target=document.getElementById('info');
target.addEventListener("click", myhandler, false);
target.removeEventListener("click", myhandler, false); //有效!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用JavaScript库还是自己写代码?
Jan 28 Javascript
一个简单的jQuery插件制作 学习过程及实例
Apr 25 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 Javascript
Javascript中的高阶函数介绍
Mar 15 Javascript
js文字横向滚动特效
Nov 11 Javascript
js控制台输出的方法(详解)
Nov 26 Javascript
基于JavaScript实现滑动门效果
Mar 16 Javascript
Vue项目添加动态浏览器头部title的方法
Jul 11 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
Sep 04 jQuery
javascript随机变色实例代码
Oct 15 Javascript
d3.js 地铁轨道交通项目实战
Nov 27 Javascript
利用js canvas实现五子棋游戏
Oct 11 Javascript
详解用vue-cli来搭建vue项目和webpack
Apr 20 #Javascript
js禁止浏览器的回退事件
Apr 20 #Javascript
vue-cli入门之项目结构分析
Apr 20 #Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
Apr 20 #Javascript
详解Vue使用 vue-cli 搭建项目
Apr 20 #Javascript
解决AngualrJS页面刷新导致异常显示问题
Apr 20 #Javascript
Vue.js实现模拟微信朋友圈开发demo
Apr 20 #Javascript
You might like
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
Gambit vs CL BO3 第三场 2.13
2021/03/10 DOTA
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
js 倒计时(高效率服务器时间同步)
2017/09/12 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
Python中安装easy_install的方法
2018/11/18 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
期末总结的个人自我评价
2013/11/02 职场文书
医学院四年学习生活的自我评价
2013/11/06 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
法人代表授权委托书
2014/04/08 职场文书
学习之星事迹材料
2014/05/17 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
个人先进事迹材料
2014/12/29 职场文书
幼儿园教师求职信
2015/03/20 职场文书
创业计划书之熟食店
2019/10/16 职场文书