Gwt 是否为html元素添加单击处理程序?

Gwt 是否为html元素添加单击处理程序?,gwt,Gwt,我有一个使用html预生成的页面,它看起来像一个可滚动的div列表,类似于: <html> <div id="a"> <div>Item A</div> </div> <div id="b"> <div>Item B</div> </div> </html> public void onModuleLoaded() { RootPa

我有一个使用html预生成的页面,它看起来像一个可滚动的div列表,类似于:

<html>
  <div id="a">
     <div>Item A</div>
  </div>
  <div id="b">
     <div>Item B</div>
  </div>
</html>
public void onModuleLoaded() {
    RootPanel rp1 = RootPanel.get("a");
    rp1.addClickHandler(...); // can't do this.
}
我怎样才能在GWT中听到对其中一个项目的单击?有没有一种方法可以让我安装一个全局点击处理程序,只需查看点击项目的ID,并对其进行过滤?我不一定需要为每个元素添加一个单击处理程序(如果有许多元素需要单击处理程序,我认为文档建议不要这样做)

谢谢


谢谢

我还没有对此进行测试,但总体思路是正确的,并且很容易扩展到多个目标元素。您可能希望预先存储DOM.getElementById()返回的元素,以加快速度。请记住,每个用户事件都会调用onPreviewActiveEvent(),因此请保持轻松

Event.addNativePreviewHandler(new NativePreviewHandler() {
    public void onPreviewNativeEvent(NativePreviewEvent event) {
        if (Event.as(event).getTypeInt() == Event.ONCLICK &&
            DOM.isOrHasChild(DOM.getElementById("A"), Element.as(event.getEventTarget()))) {
            // Element 'A' was clicked.
        }
    }
}
使用wrap()的问题在于,如果父元素已经是小部件,则不允许进行包装。您仍然可以这样做并且可以工作,但是如果您在开发模式下运行应用程序,断言将失败,从而停止应用程序

正确的(但单调乏味,在我看来是不完整的)方式是

Element elem = DOM.getElementById(“billing-component”);
DOM.sinkEvents(elem, Event.ONCLICK | Event.ONMOUSEOUT | Event.ONMOUSEOVER);
DOM.setEventListener(elem, new EventListener() {
    @Override
    public void onBrowserEvent(Event event) {
        if (Event.ONCLICK == event.getTypeInt()) {
            …
        }
    }
});

我知道这看起来不太好,事实上这并不是因为您只能将一个侦听器附加到元素,并且必须检查事件类型。

确实可以
Label.wrap(DOM.getElementById(“a”)).addClickHandler(…)
工作吗?是的,可以工作,我对使用标签感到困惑——这是否意味着它所包装的元素必须是一个只有文本的元素?如果每个列表项都是一个更复杂的列表项,并且其中嵌套了一些呢?那还能用吗?谢天谢地,这也可以很好地工作,也只是一个具有复杂内部结构的将军,这是很好的。我还没有尝试过,但是内部测试可能看起来像(这里看起来不太好):if(event.getTypeInt()==event.ONCLICK){Element Element Element=(Element)event.getSource();if(Element.getId().equals(“blah”){[如果有效,将更新帖子,如上]谢谢!