解决removeEventListener 无法清除监听的问题
1.原因
许多入前端不久的人都会遇到removeEventListener无法清除监听的情况,这是由于
要移除事件句柄,addEventListener()的执行函数必须使用外部函数,如上实例所示(myFunction)。
匿名函数,类似“document.removeEventListener(“event”,function(){myScript});”该事件是无法移除的。
而在很多情况下我们需要句柄回调的传参,又需要其他传参时免不了使用句柄,这个时候我们需要写一个方法去替代这个回调,以下是解决方式,写了一个addListener函数在addEventListener之后返回它的销毁方法
2.解决方式
functionisFn(value){
consttype=Object.prototype.toString.call(value);
returntype==='[objectFunction]';
}
functionisNode(value){
returnvalue!==undefined&&valueinstanceofHTMLElement&&value.nodeType===1;
}
functionlistenNode(node,type,callback){
node.addEventListener(type,callback);
return{
destroy(){
node.removeEventListener(type,callback);
},
};
}
functionaddListener(target,type,callback){
if(!target&&!type&&!callback){
thrownewError('缺少参数');
}
if(!isFn(callback)){
thrownewTypeError('ThirdargumentmustbeaFunction');
}
if(isNode(target)){
returnlistenNode(target,type,callback);
}
thrownewTypeError('FirstargumentmustbeaString,HTMLElement,HTMLCollection,orNodeList');
}
functionlistenNodeList(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无法清除监听的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。