深入解析:JS与Vue中事件委托(事件代理)的高效实现方法
// 事件委托的高效实现
// 使用WeakMap保存事件监听函数,避免内存泄漏
const weakMap = new WeakMap();
// 添加事件监听
function addEventListener(target, type, callback) {
target.addEventListener(type, handleEvent);
weakMap.set(callback, callback); // 使用WeakMap引用回调函数
}
// 事件处理器
function handleEvent(event) {
const callback = weakMap.get(event.target[PROXY_CALLBACK]);
if (callback) {
callback.call(event.target, event);
}
}
// 为目标元素绑定代理事件
function delegate(target, selector, type, callback) {
addEventListener(target, type, event => {
const delegatedTarget = event.target.closest(selector);
if (delegatedTarget) {
const proxyCallback = delegatedTarget[PROXY_CALLBACK] || (delegatedTarget[PROXY_CALLBACK] = () => {});
proxyCallback[PROXY_TARGET] = callback;
handleEvent({ target: delegatedTarget, ...event });
}
});
}
// 使用示例
// 假设有一个按钮的父元素和多个按钮
const parent = document.getElementById('parent');
delegate(parent, '.btn', 'click', (event) => {
console.log(`Clicked on ${event.target.textContent}`);
});
这个代码示例展示了如何使用WeakMap
来避免内存泄漏,并且通过扩展原生Event
对象来实现事件委托,从而提高了代码的可维护性和性能。
评论已关闭