解决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 相关文章推荐
js实现ASP分页函数 HTML分页函数
Sep 22 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
Mar 23 Javascript
Bootstrap树形组件jqTree的简单封装
Jan 25 Javascript
Bootstrap每天必学之导航条(二)
Mar 01 Javascript
基于JS代码实现实时显示系统时间
Jun 16 Javascript
微信小程序 scroll-view组件实现列表页实例代码
Dec 14 Javascript
搭建基于express框架运行环境的方法步骤
Nov 15 Javascript
微信小程序上线发布流程图文详解
May 06 Javascript
解决vue单页面应用中动态修改title问题
Jun 09 Javascript
vue使用websocket的方法实例分析
Jun 22 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
jquery+ajax实现异步上传文件显示进度条
Aug 17 jQuery
详解 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仿ZOL分页类代码
2008/10/02 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
laravel-admin 中列表筛选方法
2019/10/03 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
jQuery实现类似淘宝购物车全选状态示例
2013/06/26 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
让python json encode datetime类型
2010/12/28 Python
Python中的自定义函数学习笔记
2014/09/23 Python
详解Django中的权限和组以及消息
2015/07/23 Python
python3 requests中使用ip代理池随机生成ip的实例
2018/05/07 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
python网络应用开发知识点浅析
2019/05/28 Python
pytorch使用指定GPU训练的实例
2019/08/19 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
2020/06/28 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
Vichy薇姿加拿大官网:法国药妆,全球专业敏感肌护肤领先品牌
2018/07/11 全球购物
升学宴主持词
2014/04/02 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS