【发布时间】:2019-01-19 14:24:37
【问题描述】:
我在库存中有一个动态生成的项目页面。我正在尝试创建一个 onclick 事件,以便如果用户单击显示的项目信息或图像,事件侦听器将执行。我可以通过在 HTML 中添加 onclick="doSomething(this.id) 使其工作,但无法使用我见过的任何事件冒泡和事件委托教程中的方法使其工作。
项目图像和数据显示在单独的 HTML 表格中,每个项目一个。每个都有一个唯一的 id,它们都包含在一个容器 div 元素中。 addEventListener 被分配给 div,而不是每个表都有一个监听器。
似乎正在发生的是 img 元素 td 元素的点击事件触发器。 tr 或表格,如果我在单击表格元素之前非常小心地放置光标。无论我做什么,该事件似乎都不会冒泡。我应该能够让它在每个连续元素上触发,但有些东西正在停止传播。
当单击该表或任何后代元素时,我需要检索(表的)唯一 ID。
var theParent = document.querySelector('#container');
theParent.addEventListener("click", doSomething);
}
function doSomething(e) {
console.log(e.target.id) + " \r\n";
if (e.target !== e.currentTarget) {
var clickedItem = e.target.nodeName;
console.log(clickedItem);
}
}
<div id="container">
<table class="items" id="1234">
<tr>
<td>
<img src="path/to/item.jpg">
</td>
<td>
this is item 1234
</td>
</tr>
</table>
...
</div>
或
<div id="container">
<div class="items" id="1234">
<table>
<tr>
<td>
<img src="path/to/item.jpg">
</td>
<td>
this is item 1234
</td>
</tr>
</table>
</div>
...
</div>
我认为 if (e.target !== e.currentTarget) 应该为每个后代对象执行 console.log(clickedItem),但不包括 currentTarget。它没有,即使我删除了 if() 筛选。我想对此进行一些澄清,但更重要的是,我想修改 if 语句,使其仅适用于对 currentTarget 的直接后代的点击。
【问题讨论】:
-
“直接后代”——HTML 中没有任何其他类型的后代。
-
您的问题似乎是一个简单的语法错误。
-
@quentin 说没有办法区分 div#1234 和 img 元素?我觉得这很好奇。他认为这不仅仅是“一个简单的语法错误”,而是他选择不让任何人了解的秘密
-
重新思考和重新测试它可能根本不是冒泡的问题,但是由于堆叠顺序,img 和其他对象首先会遮挡 div(或表格)而不是看到点击。如果是这种情况,我可以更改逻辑并告诉用户单击图像。或者我可以使用 CSS 指针事件来操纵点击的曝光。使用 img 方法可能更聪明,但仍然希望有人澄清或确认。仅仅因为我可以让它工作,并不意味着它是正确的。
-
"@quentin 说没有办法区分 div#1234 和 img 元素?" - 我没那么说过。 div 是容器的孩子,图像是曾曾孙。他们都是直系后代。
标签: javascript events delegation