当前位置:首页 > JavaScript

js 实现 delegate

2026-02-01 18:24:36JavaScript

在 JavaScript 中实现事件委托(delegate)是一种高效的事件处理技术,它通过将事件监听器绑定到父元素而非子元素,利用事件冒泡机制动态处理子元素的事件。以下是实现事件委托的几种方法:

使用 addEventListener 和事件目标检查

通过事件冒泡捕获子元素事件,检查事件目标(event.target)是否符合条件:

document.getElementById('parent').addEventListener('click', function(event) {
  if (event.target.matches('.child')) {
    console.log('Child element clicked');
  }
});

动态处理嵌套子元素

若子元素可能包含更深层嵌套,使用 closest 方法向上查找匹配元素:

document.getElementById('parent').addEventListener('click', function(event) {
  const childElement = event.target.closest('.child');
  if (childElement) {
    console.log('Child or nested child clicked', childElement);
  }
});

封装通用事件委托函数

封装一个可复用的函数,支持选择器匹配和回调执行:

function delegate(parentSelector, childSelector, eventType, handler) {
  document.querySelector(parentSelector).addEventListener(eventType, function(e) {
    if (e.target.matches(childSelector)) {
      handler(e);
    }
  });
}

// 使用示例
delegate('#parent', '.child', 'click', (e) => {
  console.log('Delegated event triggered', e.target);
});

性能优化建议

  • 尽量选择最近的父元素作为委托容器,减少事件冒泡层级。
  • 避免在大型文档中使用全局委托(如 document),缩小监听范围。
  • 对于频繁触发的事件(如 mousemove),需谨慎使用委托。

兼容性处理

如需支持老旧浏览器,可添加 matches 的兼容性前缀:

js 实现 delegate

Element.prototype.matches = Element.prototype.matches || 
  Element.prototype.msMatchesSelector;

事件委托能显著减少内存占用,尤其适用于动态添加或大量子元素的场景。

标签: jsdelegate
分享给朋友:

相关文章

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…