首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >父事件,单击子事件(事件冒泡)

父事件,单击子事件(事件冒泡)
EN

Stack Overflow用户
提问于 2014-12-03 23:18:07
回答 2查看 4.2K关注 0票数 2

我有一个人搜索脚本,它会在你键入时显示建议。结果的结构大致如下:

代码语言:javascript
复制
<div  id="peopleResults">
  <div class="resultHolder">
    <div data-userid="ABC123" class="person">
        <div class="name">Last, First</div>
        <div class="title">Job Title</div>
        <a class="email" href="mailto:person@company.com">person@company.com</a><span class="phone">12345</span>
    </div>
    <!-- more people... -->
  </div>
</div>

由于人员列表会随着您的输入而改变,到目前为止,我一直使用JQuery的live()函数自动将单击事件绑定到所有.person元素。这种做法已被弃用,而且是糟糕的做法,因此我正在尝试更新代码。

我发现我可以使用如下内容:

代码语言:javascript
复制
$('#peopleResults').on('click', '.person', function(){
    // handle the click
})

但是我想了解更多关于如何在vanilla javascript中处理这个问题。我认为,当使用单击事件单击项目的子项时,该事件会在元素中“冒泡”起来,当它命中.person元素时,我可以捕捉到它。请原谅我草率的代码,但类似于:

代码语言:javascript
复制
document.getElementById('peopleResults').addEventListener('click', function(e){
    if(e.target.classList.contains('person')) {
        // handle click 
    }
});

我以前也做过类似的事情,但通常是使用链接。(在这种情况下,.person不能是链接,因为它包含电子邮件链接。)

所以在这种情况下,它不起作用。如果我在.person中单击.name,则目标是.name。

这似乎是一些基本的东西,只是没有在我的大脑中点击。在JavaScript中处理这个问题的典型方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2014-12-03 23:45:04

您可以将所需目标的所有子目标的pointer-events设置为none

代码语言:javascript
复制
.person > * {
  pointer-events: none;
}

这样,event.target将是一个.person元素,而不是它的子元素之一。

代码语言:javascript
复制
document.getElementById('peopleResults').addEventListener('click', function(e){
  if(e.target.classList.contains('person')) {
    alert('Person clicked');
  }
});
代码语言:javascript
复制
.person > * {
  pointer-events: none;
}
代码语言:javascript
复制
<div  id="peopleResults">
  <div class="resultHolder">
    <div data-userid="ABC123" class="person">
      <div class="name">Last, First</div>
      <div class="title">Job Title</div>
      <a class="email" href="mailto:person@company.com">person@company.com</a><span class="phone">12345</span>
    </div>
    <!-- more people... -->
  </div>
</div>

请注意,这种方法将破坏.person中的交互式元素(如链接)的功能。

票数 4
EN

Stack Overflow用户

发布于 2014-12-04 00:11:43

在使用jQuery事件时,会为您提供两个您应该熟悉的属性:

  1. target
  2. currentTarget

当使用事件委托(即捕捉父元素上的事件)时,target将是最初触发事件的元素,而currentTarget将是捕捉事件的元素。

考虑下面的代码示例:

代码语言:javascript
复制
$('#peopleResults').on('click', '.person', function(e) {
    if ($(e.currentTarget).hasClass('person')) console.log('yay!');
});

附注:当不使用事件委托时,两个属性应该指向相同的元素。

有关currentTarget的更多信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27275279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档