解决removeEventListener 无法清除监听的问题


Posted in Javascript onOctober 30, 2020

1. 原因

许多入前端不久的人都会遇到 removeEventListener 无法清除监听的情况,这是由于

要移除事件句柄,addEventListener() 的执行函数必须使用外部函数,如上实例所示 (myFunction)。

匿名函数,类似 “document.removeEventListener(“event”, function(){ myScript });” 该事件是无法移除的。

而在很多情况下我们需要句柄回调的传参,又需要其他传参时免不了使用句柄,这个时候我们需要写一个方法去替代这个回调,以下是解决方式,写了一个addListener 函数在 addEventListener 之后返回它的销毁方法

2.解决方式

function isFn(value) {
 const type = Object.prototype.toString.call(value);
 return type === '[object Function]';
}
function isNode(value) {
 return value !== undefined && value instanceof HTMLElement && value.nodeType === 1;
}

function listenNode(node, type, callback) {
 node.addEventListener(type, callback);
 return {
  destroy() {
   node.removeEventListener(type, callback);
  },
 };
}

function addListener(target, type, callback) {
 if (!target && !type && !callback) {
  throw new Error('缺少参数');
 }
 if (!isFn(callback)) {
  throw new TypeError('Third argument must be a Function');
 }
 if (isNode(target)) {
  return listenNode(target, type, callback);
 }
 throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
}

function listenNodeList(nodeList, type, callback) {
 Array.prototype.forEach.call(nodeList, node => {
  node.addEventListener(type, callback);
 });

 return {
  destroy() {
   Array.prototype.forEach.call(nodeList, node => {
    node.removeEventListener(type, callback);
   });
  },
 };
}
module.exports = listener;

补充知识:vue 创建监听,和销毁监听(addEventListener, removeEventListener)

最近在做一个有关监听scroll的功能, 发现我添加监听之后一直不起作用:

mounted() {

window.addEventListener("scroll", this.setHeadPosition); //this.setHeadPosition方法名

后来发现要在后面添加一个true之后才行:

mounted() {
 window.addEventListener("scroll", this.setHeadPosition, true);
},

而在离开是的时候需要销毁监听: (在destroyed里面销毁), 否则监听会一直存在, 因为这是单页面应用, 页面并未关闭.

destroyed() {
 window.removeEventListener("scroll", this.setHeadPosition, true);
},

在销毁的时候一定也要加上true, 否则销毁不起作用.

以上这篇解决removeEventListener 无法清除监听的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
E3 tree 1.6在Firefox下显示问题的修复方法
Jan 30 Javascript
简约JS日历控件 实例代码
Jul 12 Javascript
js获取当月最后一天实例代码
Nov 19 Javascript
获得Javascript对象属性个数的示例代码
Nov 21 Javascript
iframe窗口高度自适应的实现方法
Jan 08 Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
Aug 29 jQuery
详解vue项目首页加载速度优化
Oct 18 Javascript
vue路由嵌套的SPA实现步骤
Nov 06 Javascript
详解在HTTPS 项目中使用百度地图 API
Apr 26 Javascript
vue 实现 rem 布局或vw 布局的方法
Nov 13 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 Javascript
详解 javascript对象创建模式
Oct 30 #Javascript
ES6中的Javascript解构的实现
Oct 30 #Javascript
vue video和vue-video-player实现视频铺满教程
Oct 30 #Javascript
Echarts.js无法引入问题解决方案
Oct 30 #Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
Oct 30 #Javascript
vue 通过 Prop 向子组件传递数据的实现方法
Oct 30 #Javascript
微信小程序:报错(in promise) MiniProgramError
Oct 30 #Javascript
You might like
学习php过程中的一些注意点的总结
2013/10/25 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
Win7下手动安装apache2.2、php5.4笔记
2015/04/03 PHP
php数据访问之查询关键字
2016/05/09 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
MooTools 1.2中的Drag.Move来实现拖放
2009/09/15 Javascript
js中的string.format函数代码
2020/08/11 Javascript
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
js转换对象为xml
2017/02/17 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
jquery实现提示语淡入效果
2017/05/05 jQuery
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
Python实现的knn算法示例
2018/06/14 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
澳大利亚在线时尚精品店:Hello Molly
2018/02/26 全球购物
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
销售工作人员的自我评价分享
2013/11/10 职场文书
客户经理岗位职责
2013/12/08 职场文书
大学生在校表现评语
2014/12/31 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
python在package下继续嵌套一个package
2022/04/14 Python