我有一个简单的GWT设置用于测试:
<g:HTMLPanel ui:field="container" width="500px" height="300px">
<g:Label ui:field="inner" text="hello"></g:Label>
</g:HTMLPanel>
添加处理程序:
container.addDomHandler(new ClickHandler()
{
@Override
public void onClick(ClickEvent event)
{
Window.alert("click on container");
}
}, ClickEvent.getType());
inner.addDomHandler(new ClickHandler()
{
@Override
public void onClick(ClickEvent event)
{
Window.alert("click on inner");
}
}, ClickEvent.getType());
正如我们从消息来源所知,这些addHandler调用中的每一个都
DOM.sinkEvents(Element elem,int eventBits)
内部,后者,根据文档,“设置由给定元素沉没的当前事件集。这些事件将被触发到在任何元素的父元素上指定的最近的{@link EventListener}。 “
但实际上,如果你单击内部div,则会以3种方式中的任何一种方式点击其父div:
如果我没有在子
如果我在孩子上设置了处理程序
如果我设置了处理程序,但用
清除了ClickEvent的沉没DOM.sinkEvents(inner.getElement(),DOM.getEventsSunk(getElement())&amp; ~Event.getTypeInt(ClickEvent.getType()。getName()));
为什么会发生这种情况以及沉没这些事件的真正作用是什么? 为什么添加Handler与下沉事件有关,即向同一事件的父元素发送相同的事件? 是否可以阻止添加到给定小部件中的所有处理程序进行调用而不会明确地删除它们?即有没有办法停止处理某些小部件上的所有事件?
答案 0 :(得分:8)
首先,sinkEvent
是关于在元素上添加本机事件处理程序,如GWT wiki中所述。
您所看到的是事件冒泡,这是事件在浏览器中的工作方式:调度事件时有两个阶段:捕获阶段(未在旧IE中实现)允许任何祖先元素在事件到达之前捕获事件它的目标,然后在冒泡阶段,事件冒泡 DOM层次结构。因此,如果您收听HTMLPanel
上的点击次数,您还会收到来自Label
的冒泡点击事件。
您可以通过收听Label
级别的活动并致电stopPropagation()
来阻止这种情况发生,因此它不会冒泡到HTMLPanel
。