解决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 相关文章推荐
JavaScript父子窗体间的调用方法
Mar 31 Javascript
浅谈JavaScript对象与继承
Jul 10 Javascript
JS给Array添加是否包含字符串的简单方法
Oct 29 Javascript
Vue.js 和 MVVM 的注意事项
Nov 07 Javascript
100多个基础常用JS函数和语法集合大全
Feb 16 Javascript
讲解vue-router之什么是嵌套路由
May 28 Javascript
在小程序Canvas中使用measureText的方法示例
Oct 19 Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 Javascript
Vue实现拖放排序功能的实例代码
Jul 08 Javascript
详解nuxt 微信公众号支付遇到的问题与解决
Aug 26 Javascript
vue内置组件component--通过is属性动态渲染组件操作
Jul 28 Javascript
JavaScript架构localStorage特殊场景下二次封装操作
Jun 21 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无限分类源码分享(思路不错)
2011/10/13 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
PHP+JQUERY操作JSON实例
2017/03/23 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
jQuery中not()方法用法实例
2015/01/06 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
在Python中实现替换字符串中的子串的示例
2018/10/31 Python
Selenium定时刷新网页的实现代码
2018/10/31 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
SQL SERVER面试资料
2013/03/30 面试题
什么是makefile? 如何编写makefile?
2012/08/08 面试题
怎样写好自我评价呢?
2014/02/16 职场文书
小学综合实践活动总结
2014/07/07 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书