使用事件委托提高性能

当需要在大量元素上绑定事件的时候,特别是在动态更新的元素上,这个绑定是既麻烦又消耗性能的一件事。比较好的做法是在它们共同的父级元素上绑定一个事件,在事件冒泡阶段触发相应的效果。这种把一个元素的响应事件函数委托给另一个元素的用法便叫事件委托。

示例:

// DOM 元素
<ul>
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
</ul>

// 利用 ul 元素做事件委托
document.querySelector('ul').addEventListener('click', (e) => {
    const event = e || window.event
    const target = event.target || event.srcElement
    console.log(target.innerText) // 0 1 2 3 4
})

实际使用时往往不是每一个子元素都需要被委托,这时候可以用到 DOM 元素的一个方法 matches(),这个方法接收一个 CSS 选择器字符串,如果匹配成功返回 true,否则返回 false,例如:target.matches('li') // true

示例:

// DOM 元素
<ul>
    <li>0</li>
    <li>1</li>
    <li>2</li>
    <li class="mazey">3</li>
    <li>4</li>
</ul>

// 只委托类名为 mazey 的元素
document.querySelector('ul').addEventListener('click', (e) => {
    const event = e || window.event
    const target = event.target || event.srcElement
    if (target.matches('li.mazey')) {
        console.log(target.innerText) // 3
    }
})

注意:

不是所有事件都能用事件委托来完成,例如 focusblur 就没有冒泡,但有相应的支持冒泡的事件 focusinfocusout 来代替。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,581评论 1 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,273评论 19 139
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,286评论 0 21
  • js之事件机制 1、事件初探 1.1 js事件的概述 JavaScript事件:JavaScript是基于事件驱动...
    道无虚阅读 2,444评论 0 2
  • 1.Mybatis使用 Mybatis概述 Mybatis配置mapper配置动态SQL mybatis进阶1——...
    王侦阅读 814评论 0 5