背景
removeEventListener 无法移除匿名函数监听
解决方案
封装原生 addEventListener,暴露出移除事件监听的方法
代码
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);
});
},
};
}
export default {
listenNode,
listenNodeList
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。