如果我单击document.body.addEventListener中的任何子代,孙子(或更深的子代),如何单击父标记?>

问题描述 投票:0回答:1

请帮助您查找信息。我哪里错了?

我需要在我的script.js中应用事件委托方法。因此,我需要在body标签上捕获所有“点击”事件。无法更改。我使用:

document.body.addEventListener('click', function(event) {
  ... // here I catch clicks on different elements
}, true);

我有一个父块,并且内部嵌套块的数量未知,子代/孙子/祖父...等等

我想在父区域,子区域,孙区域中的任何区域上单击任何位置,然后在event.target.classList数组中捕获具有'父'类名称的事件。

请参阅示例代码https://codepen.io/appalse/pen/xxbqWLr

document.body.addEventListener('click', function(event) {
  alert(event.target.classList);
  if (event.target.classList.contains('parent')) {
    /* I want to catch certain target with 'parent' class name */
    event.target.classList.toggle('yellow-background');
  }
  
}, true);
div {
  border: 1px solid black;
  margin: 10px;
  padding: 10px;
}
div.parent { border-width: 3px; }
.container {
  width: 300px;
  background-color: lightgrey;
}
.parent {
  background-color: lightblue; 
  cursor: pointer;
}
.child {background-color: lightgreen;}
.grandchild {background-color: cyan;}
.yellow-background {
  background-color: yellow;
}
<body>
  <div class="container"> Container
    <div class="parent"> Parent - it catches click. OK
      <div class="child">Child - doesn't catch click.
        <div class="grandchild">Grandchild - doesn't catch click</div>
        <div class="grandchild">Grandchild - doesn't</div>
      </div>
    </div>
  </div>
</body>

我已经阅读了有关事件冒泡和捕获的信息。我在addEventListener中使用了'useCapture = true'值,以便在捕获阶段捕获事件。但这是另一种方式。我以为会为单击区域下方的每个标记调用addEventListener方法,但我看到只有最后一个子事件才调用addEventListener方法。

我无法使用event.target.parentNode,因为我不知道此目标子级有多深。但是,我可以递归调用parentNode,直到获得必要的父对象为止

。但是这种解决方案对我来说似乎很奇怪,就像黑客一样。我错了吗?这种递归方法是通用且良好的吗?

这个问题似乎真的很基础,但是在“捕获和冒泡”,“事件委托”一文中,我仅看到了最简单的示例,而没有数量未知的嵌套元素。或者他们用父标记上的addEventListener方法提出解决方案,我不能使用(因为我使用document.body.addEventListener)。

[请帮助我找到解决方案,并更好地理解此问题。任何链接或谷歌关键字,将不胜感激。

请帮助您查找信息。我哪里错了?我需要在script.js中应用事件委托方法。因此,我需要在body标签上捕获所有“点击”事件。无法更改。我使用:...

javascript javascript-events event-handling click addeventlistener
1个回答
1
投票

使用event.target.closest('.parent')查看所单击的元素是否具有祖先,即.parent。如果是这样,请更改家长的班级,否则什么也不做:

© www.soinside.com 2019 - 2024. All rights reserved.