在显示复杂HTML的GWT HTML小部件中,如何为特定子元素添加事件处理程序?

时间:2011-11-17 18:37:57

标签: gwt

我正在优化以前使用各种嵌套面板来处理DIV和Spans的GWT应用程序。我将整个表生成为单个SafeHtml对象,然后将其分配到单个SafeHtml小部件中。

我现在希望能够在特定“单元格”跨度而不是整个表格上跟踪鼠标悬停/鼠标移除事件,但我不知道如何执行此操作。

如果我向HTML小部件本身添加一个处理程序,我将获得各种元素的事件。

2 个答案:

答案 0 :(得分:6)

自2.0以来,有一种简单的方法可以做到这一点。 例如,如果HTML代码包含在某种窗口小部件(HTMLPanel或HTML)中,则可以在该窗口小部件上调用addDomHandler(<handler>,<eventtyoe>),这样您就可以从内部html接收事件。 例如,如果你在HTMLPanel中有一堆锚点,并且你想知道点击了哪一个,你可以这样做:

panel.addDomHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            Element element=  event.getNativeEvent().getEventTarget().cast();
            if(element.getTagName().equals("A")) {
                AnchorElement anchor = element.cast();
                Window.alert("Anchor with href " + anchor.getHref() + " was clicked");
            }

        }
    }, ClickEvent.getType());

由于您想要跟踪鼠标悬停/移出事件,您必须使用2个不同的dom处理程序,找出触发事件时所需的单元格,然后更改其状态。

答案 1 :(得分:-1)

解决这个问题的方法是:

  • 使用其中一种DOM方法找到所需的元素,例如DOM.getElementById(..)或任何其他方法。查看Widget.getElement()等。
  • 调用DOOM.sinkEvents(element,eventBits)DOM.sinkBitlessEvent(element,eventName)并以位掩码的形式传递您想要接收的所需事件,例如Event.MOUSEEVENTS或使用click或{{等命名事件1}}如果使用第二种方法。
  • 在元素上设置和EventListener,通过这样调用touchstart

    DOM.setEventListerner(element,eventListener)

只有您在步骤2中指定的事件才会被激活到EventListener,因此您只需处理这些事件。