背景
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}