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;