当前位置:首页 > JavaScript

js 实现 delegate

2026-03-14 17:33:36JavaScript

实现事件委托的基本原理

事件委托是利用事件冒泡机制,在父元素上监听子元素的事件。通过判断事件的目标(event.target)来执行对应的操作。这种方式可以减少事件监听器的数量,提升性能。

基础实现代码示例

function delegate(parentSelector, childSelector, eventType, handler) {
  const parent = document.querySelector(parentSelector);

  parent.addEventListener(eventType, function(event) {
    const target = event.target;
    if (target.matches(childSelector)) {
      handler.call(target, event);
    }
  });
}

支持更复杂的选择器匹配

如果需要匹配更复杂的选择器关系(如子元素内部的元素),可以改进匹配逻辑:

function delegate(parentSelector, childSelector, eventType, handler) {
  document.querySelector(parentSelector).addEventListener(eventType, function(e) {
    let el = e.target;
    while (el && el !== this) {
      if (el.matches(childSelector)) {
        handler.call(el, e);
        break;
      }
      el = el.parentNode;
    }
  });
}

使用示例

// 委托给ul处理所有li的点击事件
delegate('ul', 'li', 'click', function() {
  console.log('Clicked on:', this.textContent);
});

// 委托给div处理所有.button类的点击事件
delegate('.container', '.button', 'click', function() {
  this.classList.toggle('active');
});

注意事项

事件委托时需要注意事件目标可能不是直接匹配的子元素,而是子元素内部的元素。上述改进版本通过向上遍历DOM树来解决这个问题。

某些事件(如focus/blur)不会冒泡,需要使用它们的冒泡版本focusin/focusout。

js 实现 delegate

现代浏览器已经原生支持事件委托模式,可以通过Element.matches()方法判断事件目标。

标签: jsdelegate
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…