gpt4 book ai didi

java - GWT sinkEvent 功能如何工作?

转载 作者:搜寻专家 更新时间:2023-10-31 19:39:10 24 4
gpt4 key购买 nike

我有一个简单的 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)

inside,后者,根据文档,“设置给定元素沉没的当前事件集。这些事件将被触发到最近的{@link EventListener},该元素在任何元素的父元素上指定。 "

但实际上,如果您点击内部 div,点击将以 3 种方式中的任何一种触发到其父 div:

  • 如果我没有为 child 设置任何 ClickHandlers

  • 如果我已经为 child 设置了处理程序

  • 如果我设置了handlers,但是清除了ClickEvent的下沉

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

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

最佳答案

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

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

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

关于java - GWT sinkEvent 功能如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20004658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com