【发布时间】:2015-12-18 13:50:43
【问题描述】:
有什么方法可以阻止事件链中的某些侦听器触发事件,但允许链上更远的其他侦听器触发?
例如我有这个结构
<body>
<div id="1">
<div id="2">
<button>Click Me</button>
</div>
</div>
</body>
假设我将单击事件侦听器附加到 body、div#1 和 div#2。是否可以在 div#2 事件侦听器中阻止事件进入 div#1 或介于两者之间的任何其他侦听器,并允许事件在 body 元素上触发?
我这样说是因为我正在使用 google maps 和 emberjs 来构建一堆可以显示在地图上的交互式信息框。问题是 ember 在 body 元素上附加了事件侦听器,而 google 将它们附加在其他未知级别。当一个 click 事件被托管在 google maps 覆盖层内的 emberjs HTML 节点触发时,该事件必须首先通过 google maps 处理程序,然后才能到达 ember's。
这会导致一些意想不到的副作用,例如谷歌地图认为我正在点击其他标记。 IE。这个问题。 Mousing over Infobox fires hover event on markers that are behind it
【问题讨论】:
-
不,不是。这甚至不是传播的工作方式。您要么在层次结构中的某个点停止传播,要么不停止传播。您不会跳过层次结构的多个级别,然后继续事件传播。听起来您需要以更基本的方式解决您的问题,但我们需要一个更具体的实际问题示例,并使用所涉及的实际工具来了解建议的内容。
-
@AndrewParamoshkin 那是 jQuery,没有在问题上标记。而且,OP 专门要求继续传播,但不要在链中的某些元素上触发。来自 jQuery 文档:防止事件在 DOM 树中冒泡,防止任何父处理程序收到事件通知
-
我的猜测是,您需要找到一种方法让 ember 直接在您的信息框上处理事件,而不是等到事情一直回到文档中。我不知道 ember 建议如何做到这一点。
-
@jfriend00,这是我害怕的,但我想答案会是。我想也许有办法在我停止它后在正确的水平上重新触发它。据我所知,改变 ember 或 google 的行为似乎也几乎不可能。
标签: javascript events ember.js