掌握 Javascript 中的事件委托

更新日期: 2023-11-28阅读: 729标签: 事件

在网络开发领域,交互性至关重要。创建响应灵敏且引人入胜的 Web 应用程序的能力是成功 Web 开发人员的标志。构建交互式 Web 应用程序的核心方面之一是事件处理。JavaScript 作为网络语言,提供了强大的事件处理机制,而在这些机制中,事件委托是一个重要的概念。


什么是事件委托?

事件委托是 JavaScript 中的一种设计模式,可简化事件处理,使您的代码更加高效且易于管理。它允许您将单个事件侦听器附加到父元素,然后捕获其子元素上的事件。当处理动态内容(例如动态添加或删除元素的列表、表格或用户界面)时,此技术特别有用。

假设您有一个 html 文档中的项目列表,并且您想要响应每个项目上的单击事件。最简单的方法是将单独的事件侦听器附加到每个项目。然而,随着列表的增长,监听器的数量也会增加,这可能会导致性能问题和繁琐的代码维护。事件委托提供了更好的选择。

事件委托的好处

事件委托具有多个优点,使其成为在 JavaScript 中处理事件的首选:

  1. 效率:通过将单个事件侦听器附加到父元素,可以减少事件处理程序的数量,从而提高性能,尤其是在具有许多元素的情况下。

  2. 简单性:事件委托通过集中事件处理逻辑来简化您的代码。这使您的代码更易于阅读和维护,减少引入错误的机会。

  3. 动态内容:在处理动态生成的内容时,事件委托可确保事件处理逻辑涵盖新添加的元素,而无需您手动添加事件侦听器。

  4. 更少的内存消耗:事件侦听器越少,您的应用程序消耗的内存就越少,从而有利于用户体验和服务器资源。


事件委托如何运作?

事件委托通过利用文档对象模型 (dom) 中的事件传播来工作。在 DOM 中,事件从触发事件的目标元素传播到文档的根。事件传播的三个阶段是:

  1. 捕获阶段:事件从 DOM 树的根向下传播到目标元素。
  2. 目标阶段:事件发生在目标元素处。
  3. 冒泡阶段:事件从目标元素向上传播到根。

事件委托通常涉及在冒泡阶段捕获事件,其工作原理如下:

  1. 将单个事件侦听器附加到要监视的元素的共同祖先。

  2. 检查事件的target属性以确定哪个特定子元素触发了该事件。

  3. 根据触发事件的子元素执行所需的操作。

代码示例:实践中的事件委托

为了说明事件委托的工作原理,我们将创建一个简单的 HTML 文档,其中包含包含列表项 (li) 的无序列表 (ul)。我们将使用事件委托来处理列表项上的单击事件。

<!DOCTYPE html>
<html>
<head>
    <title>Event Delegation Example</title>
</head>
<body>
    <ul id="itemList">
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
        <li>Item 4</li>
        <li>Item 5</li>
    </ul>

    <script>
        // Get the parent element to which we'll attach the event listener
        const itemList = document.getElementById('itemList');

        // Add a single event listener for click events on the parent element
        itemList.addEventListener('click', function(event) {
            // Check if the event target is an li element
            if (event.target.tagName === 'LI') {
                // Perform the desired action (e.g., display the item text)
                alert('You clicked: ' + event.target.textContent);
            }
        });
    </script>
</body>
</html>

在此示例中,我们首先使用 id 为“itemList”获取父元素getElementById。然后,我们向该父元素添加一个“click”事件的事件侦听器。

在事件监听器函数中,我们通过检查事件的target属性(触发事件的元素)是否是一个<li>元素tagName。如果满足条件,我们将执行所需的操作,在本例中是显示一条警报,其中包含单击的列表项的文本。

此代码演示了事件委托的实际操作,并且很容易看出它如何简化项目列表的事件处理。无论列表中有多少项,都只会将一个事件侦听器附加到父元素,从而使您的代码保持高效且可维护。


事件委托的用例

事件委托是一种通用技术,可以应用于 Web 开发中的各种场景。以下是一些常见用例:

  1. 列表项或菜单:如前面的示例所示,处理项目列表或菜单上的单击事件是事件委托的经典用例。您可以使用它来有效管理用户与各种列表元素的交互。

  2. 表行和单元格:使用表时,事件委托非常方便。您可以使用它来处理事件,例如单击表行或表中的单元格。在处理动态生成行和单元格的大型数据集时,这变得特别有用。

  3. 表单控件:通过事件委托,可以更轻松地管理输入字段、按钮或复选框等表单控件上的事件。它简化了表单中不同输入元素的事件处理。

  4. 选项卡和手风琴:创建选项卡式界面或手风琴时,事件委托可确保用户交互组织良好且高性能。您可以将单击事件委托给选项卡标题或手风琴部分。

  5. UI 组件:自定义用户界面组件(例如滑块、工具提示或模式)可以从事件委托中受益。它使事件处理逻辑保持集中并提高组件的响应能力。


事件委托的最佳实践

虽然事件委托是一个强大的工具,但必须遵循最佳实践以确保其有效使用。以下是在 Web 应用程序中实现事件委托的一些技巧:

  1. 选择共同祖先:选择与目标元素尽可能接近的共同祖先元素。这减少了事件监听器操作的区域,提高了效率。

  2. 适当地使用事件类型:为所需的行为选择适当的事件类型。例如,如果要捕获点击,请使用“click”事件;如果您需要响应按键,请使用“keydown”或“keyup”事件。

  3. 检查事件目标:始终检查event.target属性以确保事件来自您要处理的特定元素。这可以防止不相关元素发生意外操作。

  4. 逻辑地组织代码:保持事件处理代码的组织性和可维护性。考虑使用函数或模块来封装事件处理逻辑,尤其是在复杂的应用程序中。

  5. 动态内容:如果您的应用程序动态生成内容,请确保在添加或删除新元素时重新应用事件委托。您可以通过将事件侦听器重新附加到父元素来完成此操作。


现代框架中的事件委托

事件委托不仅限于普通 JavaScript。许多现代 JavaScript 框架和库,例如 reactvue.js 和 angular,都将事件委托原则纳入其组件中。这些框架通常提供抽象,使事件委托更加高效且用户友好。

例如,在 React 中,您可以使用onClickprop 将单击事件委托给父组件。Vue.js 提供了@click实现类似结果的指令。通过遵循特定于框架的指南,您可以在应用程序中无缝地实现事件委托。

下面是 React 中事件委托的一个简短示例:

import React from 'react';

class ItemList extends React.Component {
    handleClick = (event) => {
        if (event.target.tagName === 'LI') {
            alert('You clicked: ' + event.target.textContent);
        }
    }

    render() {
        return (
            <ul onClick={this.handleClick}>
                <li>Item 1</li>
                <li>Item 2</li>
                <li>Item 3</li>
                <li>Item 4</li>
                <li>Item 5</li>
            </ul>
        );
    }
}

export default ItemList;

在此 React 示例中,我们使用onClickprop 将单击事件委托给<ul>元素。事件处理函数handleClick检查tagName事件目标的 以确定单击了哪个列表项。这种方法符合普通 JavaScript 中事件委托的原则。


结论

事件委托是 Web 开发中的一个基本概念,它简化了事件处理并有助于提高代码的效率和可维护性。通过将单个事件侦听器附加到公共祖先元素,您可以有效地管理多个子元素上的事件,即使在具有动态内容的场景中也是如此。

了解事件委托的原则并将其合并到您的 Web 开发项目中可以提高性能、更简洁的代码和响应更快的用户体验。无论您使用的是普通 JavaScript 还是现代框架,事件委托都是每个 Web 开发人员的工具包中都应该具备的技术。

当您继续探索 Web 开发世界时,请记住,事件委托只是可以帮助您创建强大的交互式 Web 应用程序的众多技术之一。拥抱它、实践它,并将其应用到您的项目中,以提升您作为 Web 开发人员的技能。

链接: https://fly63.com/article/detial/12582

js中addEventListener事件监听器参数详解

我们都知道addEventListener() 的参数约定是:useCapture是可选参数,默认值为false,目前DOM 规范做了修订:addEventListener() 的第三个参数可以是个对象值了。passive就是告诉浏览器我可不可以用stopPropagation...

js监听浏览器返回,pushState,popstate 事件,window.history对象

在WebApp或浏览器中,会有点击返回、后退、上一页等按钮实现自己的关闭页面、调整到指定页面、确认离开页面或执行一些其它操作的需求。可以使用 popstate 事件进行监听返回、后退、上一页操作。

CSS中的pointer-events属性实现点穿效果

具有层级关系的结构中,使用了pointer-events:none 属性将会使当前元素中的事件不会被捕获,从而实现了点穿的效果。而当代码示例中假如top元素具有子元素且显示指定pointer-events属性不为none的时候,top元素注册的事件将会被捕获/冒泡触发

js鼠标事件参数,获取鼠标在网页中的坐标

事件对象 event,JavaScript 将事件event作为参数传递,IE中把 event 事件对象作为全局对象 window 的一个属性,获取鼠标在网页中的坐标 = 鼠标在视窗中的坐标 + 浏览器滚动条坐标

js事件冒泡和默认事件处理(原生js、vue)

何为默认事件?比如 a 会跳转页面,submit 会提交表单等。普通js方法:e.preventDefault()函数。Vue.js方法: .prevent 是vue 的内置修饰符,调用了 event.preventDefault()阻止默认事件

js keyup、keypress和keydown事件 详解

js keyup、keypress和keydown事件都是有关于键盘的事件,当一个按键被pressed 或released在每一个现代浏览器中,都可能有三种客户端事件。

深入nodejs-核心模块Events详解(事件驱动)

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O的模型,使其轻量又高效。比如,文件操作中的fs事件流,网络编程所用到的tcp,http模块等,当你回想自己写的程序后,会发现很多操作都基于事件驱动,Events类。

纯CSS实现点击事件展现隐藏div菜单列表/元素切换

在写移动端导航的时候经常用到点击按钮出现/隐藏导航条的情况,最常见的方法当然还是前端框架直接调用,省心省力,不易出错;当然还有使用纯JS实现的小代码段。我这里整理了纯CSS实现方式,给需要的人和给自己做个笔记:实现原理利用CSS伪类:target

关于鼠标移动太快导致moseleave事件不触发的问题

我做的是一个table的编辑功能,当移入某行的时候展示编辑状态,在移出某行的时候显示的是原始状态,此时遇到一种情况,就是.当mousenter事件触发之后,由于鼠标移动得太快,同一个tr上绑定的mouseleave事件压根儿就没有执行。

Js事件传播流程

js事件传播流程主要分三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。在我们平常用的addEventListener方法中,一般只会用到两个参数,一个是需要绑定的事件,另一个是触发事件后要执行的函数

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!