解决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 相关文章推荐
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
Mar 24 Javascript
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 Javascript
js 弹出框只弹一次(二次修改之后的)
Nov 26 Javascript
JavaScript通过join函数连接数组里所有元素的方法
Mar 20 Javascript
JavaScript中的Function函数
Aug 27 Javascript
jQuery中ajax错误调试分析
Dec 01 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
js实现tab切换效果
Feb 16 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
vue-i18n结合Element-ui的配置方法
May 20 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
Dec 12 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 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/06/06 PHP
关于crontab的使用详解
2013/06/24 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
PHP写日志的实现方法
2014/11/05 PHP
PHP实现的一致性哈希算法完整实例
2015/11/14 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
基于Jquery+Ajax+Json实现分页显示附效果图
2014/07/30 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
jQuery获取父元素及父节点的方法小结
2016/04/14 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
javascript入门之数组[新手必看]
2016/11/21 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
layui导航栏实现代码
2017/05/19 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
Python 列表理解及使用方法
2017/10/27 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
HTML5未来发展趋势
2016/02/01 HTML / CSS
某公司C#程序员面试题笔试题
2014/05/26 面试题
学院书画协会部门职责
2013/11/28 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
基于Python实现射击小游戏的制作
2022/04/06 Python