Java GWT sinkEvent功能是如何工作的?

Java GWT sinkEvent功能是如何工作的?,java,events,gwt,Java,Events,Gwt,我有一个简单的GWT测试设置: <g:HTMLPanel ui:field="container" width="500px" height="300px"> <g:Label ui:field="inner" text="hello"></g:Label> </g:HTMLPanel> 这些addHandler调用中的每一个,正如我们从源代码中知道的 DOM.sinkEvents(元素elem,int-eventBits) 根据docs

我有一个简单的GWT测试设置:

<g:HTMLPanel ui:field="container" width="500px" height="300px">
    <g:Label ui:field="inner" text="hello"></g:Label>
</g:HTMLPanel>
这些addHandler调用中的每一个,正如我们从源代码中知道的

DOM.sinkEvents(元素elem,int-eventBits)

根据docs的说法,inside和后者“设置由给定元素沉没的当前事件集。这些事件将被激发到在元素的任何父元素上指定的最近的{@link EventListener}”

但事实上,如果单击内部div,则单击将通过以下三种方式之一激发到其父div:

  • 如果我没有在child上设置任何ClickHandler

  • 如果我在child上设置了处理程序

  • 如果我设置了处理程序,但清除了ClickEvent的下沉

DOM.sinkEvents(internal.getElement()、DOM.getEventsLink(getElement())&~Event.getTypeInt(ClickEvent.getType().getName())

为什么会发生这种情况,以及击沉这些事件的真正作用是什么? 为什么添加处理程序与下沉事件相关,即向给定元素的父元素触发相同的事件?
是否可以防止添加到给定小部件的所有处理程序在不明确删除它们的情况下调用它们?例如,是否有方法停止处理某个小部件上的所有事件?

首先,
sinkEvent
是关于在元素上添加本机事件处理程序,如中所述

您看到的是事件冒泡,这是事件在浏览器中的工作方式:调度事件时有两个阶段:捕获阶段(未在旧IEs中实现)允许任何祖先元素在事件到达其目标之前捕获事件,然后在冒泡阶段,事件在DOM层次结构中冒泡。因此,如果您在
HTMLPanel
上收听点击,您还将从
标签
接收冒泡点击事件


您可以通过在
标签
级别收听事件并调用
stopPropagation()
来防止这种情况,这样它就不会冒泡到
HTMLPanel

谢谢,Thomas。但是,如果我想阻止任何事件的处理,即使是在标签级别,看起来我所需要的只是通过DOM.sinkEvents(Label.getElement(),0)将sunkEvents归零,对吗?我可以通过添加ClickEvent位掩码轻松地将其切换回来,而无需添加/删除处理程序。这很有效,但这是一个非常丑陋的黑客行为!在事件处理程序中测试您是否有一些工作要做(即,您是否被禁用)怎么样
sinkEvents
实际上是一个低级API,应该只在小部件内部使用;不要弄乱其他小部件,否则你可能会弄坏它们。这就是我所做的-在所有事件处理程序中添加if子句,以防止在禁用小部件时处理事件。但实际上,在5个处理程序中复制粘贴相同的“if”看起来也不太好/不幸的是,链接死了。这些事情发生在2yo链接上。链接已修复。
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());