【问题标题】:How does the GWT sinkEvent functionality works?GWT sinkEvent 功能如何工作?
【发布时间】:2013-11-15 15:33:23
【问题描述】:

我有一个用于测试的简单 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:

  • 如果我没有在孩子上设置任何 ClickHandlers

  • 如果我在子节点上设置了处理程序

  • 如果我设置了处理程序,但是用

  • 清除了 ClickEvent 的下沉

DOM.sinkEvents(inner.getElement(), DOM.getEventsSunk(getElement()) & ~Event.getTypeInt(ClickEvent.getType().getName()));

为什么会发生这种情况,沉没事件的真正作用是什么? 为什么添加 Handler 与接收事件有关,即向给定元素的父级触发相同的事件? 是否可以阻止所有添加到给定小部件的处理程序调用而不显式删除它们? IE。有没有办法停止处理某些小部件上的所有事件?

【问题讨论】:

    标签: java events gwt


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,托马斯。但是,如果我想阻止任何事件甚至在标签级别上进行处理 - 看起来我所需要的只是通过 DOM.sinkEvents(label.getElement(), 0) 将 sunkEvents 清零,对吗?而且我可以通过添加 ClickEvent 位掩码轻松地将其切换回来,而无需添加/删除处理程序。
    • 这行得通,但这是一个大丑陋的黑客!在事件处理程序中测试你是否有工作要做(即你是否被禁用)怎么样? sinkEvents 确实是一个低级 API,只能在小部件内部使用;不要弄乱其他小部件,否则您可能会破坏它们。
    • 这就是我所做的 - 在我的所有事件处理程序中添加了 if 子句,以防止在我的小部件被禁用时处理事件。但是在 5 个处理程序中复制粘贴相同的 'if' 看起来也不太好,实际上.. :/
    • 链接已失效。
    • 这些事情发生在 2yo 链接上。链接已修复。
    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2012-02-24
    • 2012-09-06
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多