请帮助您查找信息。我哪里错了?
我需要在我的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标签上捕获所有“点击”事件。无法更改。我使用:...
使用event.target.closest('.parent')
查看所单击的元素是否具有祖先,即.parent
。如果是这样,请更改家长的班级,否则什么也不做: