我有一个简单的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)
根据文档,"Sets the current set of events sunk by a given element. These events will be fired to the nearest {@link EventListener} specified on any of the element's parents."
实际上,如果单击内部 div,无论以哪种方式处理,单击事件都将传递到其父div:
如果我没有在子元素上设置任何 ClickHandlers
如果我已经为子元素设置了处理程序
如果我已经设置了处理程序,但清除了 ClickEvent 的下沉
DOM.sinkEvents(inner.getElement(), DOM.getEventsSunk(getElement()) & ~Event.getTypeInt(ClickEvent.getType().getName()));
为什么会发生这种情况?事件下沉的真正作用是什么?添加处理程序与事件下沉有何关联?是否有可能在不显式删除处理程序的情况下防止给定小部件上添加的所有处理程序都被调用?也就是说,有没有一种方法可以停止处理某个小组件上的所有事件?
sinkEvents
真的是一个低级API,只应在小部件内部使用;不要干扰其他小部件,否则可能会破坏它们。 - Thomas Broyer