解决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 相关文章推荐
jQuery操作input type=radio的实现代码
Jun 14 Javascript
javascripit实现密码强度检测代码分享
Dec 12 Javascript
js简单的点击返回顶部效果实现方法
Apr 10 Javascript
在浏览器中打开或关闭JavaScript的方法
Jun 03 Javascript
每天一篇javascript学习小结(属性定义方法)
Nov 19 Javascript
最简单的JavaScript图片轮播代码(两种方法)
Dec 18 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
Oct 20 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
Jun 11 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
Nov 18 Javascript
Vue中的无限加载vue-infinite-loading的方法
Apr 08 Javascript
微信小程序实现文字跑马灯
May 26 Javascript
在vue中使用jsonp进行跨域请求接口操作
Oct 29 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
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
ThinkPHP自定义函数解决模板标签加减运算的方法
2015/07/03 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
php扩展开发入门demo示例
2019/09/23 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
JavaScript的String字符串对象常用操作总结
2016/05/26 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
layui使用及简单的三级联动实现教程
2020/12/01 Javascript
wxpython学习笔记(推荐查看)
2014/06/09 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
Python3内置模块random随机方法小结
2019/07/13 Python
python tornado修改log输出方式
2019/11/18 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
趣味体育活动方案
2014/02/08 职场文书
横幅标语大全
2014/06/17 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
买房子个人收入证明
2014/10/12 职场文书
见习报告的格式
2014/10/31 职场文书
小学教师读书笔记
2015/07/01 职场文书
户外拓展训练感想
2015/08/07 职场文书
初中数学教学反思范文
2016/02/17 职场文书
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
python分分钟绘制精美地图海报
2022/02/15 Python