使用事件委托时获取当前冒泡阶段的目标

Getting the target of the current bubbling phase when using event delegation

我有一个包含一些按钮的 div,我想将事件侦听器附加到 div 以侦听从其中的按钮冒出的事件。

我 运行 遇到的问题是 event.currentTarget 的值似乎与 docs 所说的不匹配。

考虑以下代码:

$('.container').on('click', '.myButton', function(event) {
  console.log("event.currentTarget:");
  console.log(event.currentTarget);

  console.log("event.target: ");
  console.log(event.target);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="container">
  <button class="myButton">Click Me</button>
</div>

我正在使用 jquery 1.8.3

event.currentTarget 应该是容器 div,但它被设置为其中的按钮。

我该如何解决这个问题。这是一个已知错误还是我做错了什么?

您选择容器 div 的假设与您的事件绑定是错误的。

如果您要执行以下操作:

$('.container').on('click', function(){/**/});

那么您的 event.currentTarget 就是容器。 event.target 可以是下面的任何内容。

如果您添加选择器 .myButton,事件将委托给该选择器,但不会委托给“.container”。

我认为它正在按预期工作。

在上述情况下,事件直接附加到按钮,因此 currentTarget 和 target 将始终相同。

$('.container').on('click', '.myButton', function(event) {}); does not mean that the event is attached to the div. It is just delegating the event. Meaning, the event will bubble up only till .container and the event is still attached ONLY to .myButton

案例 1: 如果事件附加到 div

  1. 如果单击按钮,则 currentTarget 将是按钮,目标将是 div。
  2. 如果单击 div,则当前目标将为 div,目标也将为 div

例子

$('.container').on('click', function(event) {
  console.log(event.currentTarget);
  console.log(event.target);
});
div{
  border: 1px solid;
  width: 150px;
  height: 150px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="container">
  <button class="myButton">Click Me</button>
  Click me
</div>

情况 2:(您的情况)如果事件附加到按钮,则 currentTarget 和目标将始终是按钮

$('.container').on('click','.myButton', function(event) {
  console.log(event.currentTarget);
  console.log(event.target);
});
div{
  border: 1px solid;
  width: 150px;
  height: 150px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="container">
  <button class="myButton">Click Me</button>
  Click me
</div>

根据http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event-currentTarget

event.currentTarget is used to indicate the EventTarget whose EventListeners are currently being processed. This is particularly useful during capturing and bubbling.

所以根据你的代码,它正在做它应该做的事情。要获得 parent,您可以尝试 var $target = $('event.target').parent();

这是因为您使用的是 jQuery 而不是原生 JavaScript。

function testClick(e){
  console.log("event.currentTarget:");
  console.log(event.currentTarget);

  console.log("event.target: ");
  console.log(event.target);
}
$('.container').on('click', '.myButton', testClick);
document.getElementsByClassName('container')[0].addEventListener("click", testClick);