addeventlistener事件第三个参数_JavaScript中事件委托的简单说明

v2-92bd552de23ceef04ddd12232c0eb221_1440w.jpg?source=172ae18b

1.为什么要进行事件委托?

单击HTML按钮后,将消息记录到控制台。

要使其正常工作,您需要选择按钮,然后使用addEventListener()方法来附加事件监听器:

v2-0989eff57bb074aa1e6e3b7c8eba530a_b.jpg

这就是侦听单个元素(尤其是按钮)上的事件的方式。

监听多个按钮上的事件呢?这是一个可能的实现:

v2-df68af181d4461cf7ca6e9df9c1eb1d1_b.jpg

查看Codesandbox演示以了解其工作原理。

迭代按钮列表,for (const button of buttons)并将新的侦听器附加到每个按钮。另外,在列表中添加或删除按钮时,您必须手动删除或附加事件侦听器。

有没有更好的方法?

幸运的是,使用事件委托模式时,侦听多个元素上的事件仅需要一个事件侦听器。

事件委托使用事件传播机制的细节。若要了解事件委派的工作原理,建议您首先了解事件传播。

2.事件传播

当您单击以下html中的按钮时:

v2-6ab0f7cd23f4c4e687fc831e7ed454bf_b.jpg

点击事件会触发多少个元素?毫无疑问,按钮本身会收到单击事件。而且...所有按钮的祖先,甚至documentwindow对象。

点击事件分三个阶段传播:

  1. 捕获阶段 -从开始windowdocument和根元素,事件潜水向下穿过目标元素的祖先
  2. 目标阶段 -事件在用户单击的元素上触发
  3. 冒泡阶段 -最后,事件冒泡通过目标元素的祖先直到根元素document和为止window

v2-a471eaf061cec0dbb3dcaccc1919a7b2_b.jpg

方法的第三个参数captureOrOptions

v2-2a9513a4e8c870803a0292cb93c9cfc7_b.jpeg

使您可以捕获来自不同阶段的事件。

  • 如果captureOrOptions缺少参数false{ capture: false },那么侦听器将捕获目标和气泡阶段的事件
  • 如果参数为trueor { capture: true },则侦听器侦听捕获阶段的事件。

在以下代码示例中,您侦听<body>元素上发生的捕获阶段的点击事件:

v2-c57453a643c5397ee2dec3fead85fef6_b.jpg

在此Codesandbox演示中,单击按钮时,您可以在控制台中看到事件的传播方式。

好的,事件传播如何帮助捕获多个按钮的事件?

该算法很简单:将事件侦听器附加到按钮的父级,并在单击按钮时捕获冒泡事件。这正是事件委托的工作方式。

3.活动委托

让我们使用事件委托来捕获多个按钮上的点击:

v2-10e77ffa6e3c8c2aae0a4c6804e11bfe_b.jpg

打开Codesandbox演示,然后单击任何按钮-您将看到'Click!'消息记录到控制台。

事件委托的思想很简单。无需将事件侦听器直接附加到按钮,而是将侦听委托给父对象<div id="buttons">。单击按钮时,父元素的侦听器将捕获冒泡事件(还记得事件传播吗?)。

使用事件委托需要3个步骤:

步骤1.确定要监视事件的元素的父级

在上面的示例中,<div id="buttons">是按钮的父元素。

步骤2.将事件侦听器附加到父元素

document.getElementById('buttons') .addEventListener('click', handler)将事件侦听器附加到按钮的父元素。此事件侦听器也对按钮单击做出反应,因为按钮单击事件在祖先中冒泡(由于事件传播)。

步骤3.使用event.target选择目标元素

单击按钮时,将使用以下参数调用处理程序函数:event对象。该属性event.target访问在其上调度了事件的元素,在该示例中为按钮:

v2-cf898ac563a86ef2f76d64d535d0a46b_b.jpg

作为附带说明,event.currentTarget指向事件侦听器直接附加到的元素。在示例中,event.currentTarget<div id="buttons">

现在,您可以看到事件委托模式的好处:与其像以前那样将侦听器附加到每个按钮上,不如通过事件委托,只需一个事件侦听器即可

4.总结

当发生点击事件(或传播的任何其他事件)时:

  • 事件从windowdocument根元素向下传播,并通过目标元素的祖先(捕获阶段)
  • 事件发生在目标上(目标阶段)
  • 最后,事件通过目标祖先冒泡直到根元素documentwindow(冒泡阶段)。

这种机制称为事件传播

事件委托是一种有用的模式,因为您可以仅使用一个事件处理程序来侦听多个元素上的事件。

使事件委派工作需要三个步骤:

  1. 确定要监视事件的元素的父级
  2. 将事件侦听器附加到父元素
  3. 使用event.target选择目标元素

原著作者:德米特里·帕夫鲁汀

文章来源:国外

文章链接:

Dmitri Pavlutin Blog​dmitripavlutin.com
v2-b9982406b5748fc7a5f0a51ce00e670f_ipico.jpg

PS:原著文章内容为英文版本,建议使用360极速浏览器进行翻译阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值