【发布时间】:2017-04-03 12:41:00
【问题描述】:
我有以下 DOM 结构:
#container {
position: absolute;
width: 100px;
height: 100px;
background-color: blue;
}
#content {
position: absolute;
width: 90%;
height: 90%;
background-color: yellow;
}
#content_child {
position: absolute;
width: 30px;
height: 30px;
left: 150px;
top: 150px;
background-color: red;
}
<div id="container">
<div id="content">
<div id="content_text">Hello</div>
<div id="content_child"></div>
</div>
</div>
#content_text 和 #content_child 会有各种鼠标事件。我想检测#container 上的鼠标事件。但是,如果我只是将事件附加到#container,它们将被它的孩子激活,这是不希望的。我的要求如下(我以点击事件为例):
- 当
#container被点击时,我希望它的事件触发 - 当一个孩子以图形方式位于 在其 div(如
#content_text)被点击时,我希望孩子和#container的事件都被触发李> - 当一个孩子以图形方式位于外部其 div(如
#content_child)被点击时,我希望仅触发孩子的事件
我事先知道哪些孩子会在 div 的外部和内部。
我能想到两种方法,都相当有缺陷:
- 将鼠标事件附加到
#container,并为div 之外的每个子项添加与附加到#container相同的事件,但使处理程序不做任何事情并使它们不传播。这有点笨拙。 - 添加一个“hit area”/“hitbox” div...某处。这将是一个透明 div,它是
#container的子代(并且大小相同),它会注册点击,这不会传播给它的兄弟姐妹的孩子,即#content的孩子,因为它们是兄弟姐妹。如果我把它放在#content之前,所有的hitbox 事件都会被#content吃掉,而且它们永远不会触发。如果我把它放在后面,反过来也是同样的问题。我不能让两者同时在同一个地方收听相同的事件,而不将它们传递给他们所有的孩子。
有没有一种方法可以在不进行重大重组或花哨的 Javascript 的情况下实现 hitbox 类型的行为(我使用的是 Elm,所以两者都不是一个选项)?
【问题讨论】:
-
event.target 和 currentTarget 会帮助你。
-
按照建议做。 event.currentTarget 是对附加事件的元素的引用(在您的情况下是容器),而 event.target 是对已单击的元素的引用。您可以使用例如 element.match 函数,将点击的元素与给定的 css 选择器进行匹配。
-
事件目标不关心元素在哪里显示,但要考虑 DOM 结构。所以检查目标对“图形内部/外部”的东西没有帮助;在这种情况下,您必须计算点击是发生在元素“内部”还是“外部”。
标签: javascript html css events elm