解决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入门教程(3) js面向对象
Jan 31 Javascript
jquery1.4 教程二 ajax方法的改进
Feb 25 Javascript
Javascript 面向对象 继承
May 13 Javascript
JQuery 操作select标签实现代码
May 14 Javascript
jQuery中调用WebService方法小结
Mar 28 Javascript
js父页面与子页面不同时显示的方法
Oct 16 Javascript
JavaScript基础知识之方法汇总结
Jan 24 Javascript
ES6记录异步函数的执行时间详解
Aug 31 Javascript
angular.js 路由及页面传参示例
Feb 24 Javascript
微信小程序获取手机号授权用户登录功能
Nov 09 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
Aug 20 Javascript
Jquery动态列功能完整实例
Aug 30 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 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
一个javascript图片阅览组件
2010/11/09 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
微信小程序开发背景图显示功能
2018/08/08 Javascript
vue监听对象及对象属性问题
2018/08/20 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
2018/10/19 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
vue 父组件通过v-model接收子组件的值的代码
2019/10/27 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
Django中Model的使用方法教程
2018/03/07 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
python属于解释型语言么
2020/06/15 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
Python3中对json格式数据的分析处理
2021/01/28 Python
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
3分钟演讲稿
2014/04/30 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python