解决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类型检查实现代码
Oct 29 Javascript
node.js学习总结之调式代码的方法
Jun 25 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
Oct 14 Javascript
jQuery判断元素上是否绑定了指定事件的方法
Mar 17 Javascript
JQuery插件jcarousellite的参数中文说明
May 11 Javascript
js中javascript:void(0) 真正含义
Nov 05 Javascript
jQuery遍历节点树方法分析
Sep 08 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
Sep 12 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
Sep 18 Javascript
ckeditor一键排版功能实现方法分析
Feb 06 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
Oct 13 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
2015/12/22 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
display和visibility的区别示例介绍
2014/02/26 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
Windows下PyCharm2018.3.2 安装教程(图文详解)
2019/10/24 Python
Python 实现OpenCV格式和PIL.Image格式互转
2020/01/09 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
售后专员岗位职责
2013/12/08 职场文书
物业招聘计划书
2014/01/10 职场文书
承认错误的检讨书
2014/01/30 职场文书
活动总结范文
2014/08/30 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
小型婚礼主持词
2015/06/30 职场文书
解决Tkinter中button按钮未按却主动执行command函数的问题
2021/05/23 Python
pytorch Dropout过拟合的操作
2021/05/27 Python