2010-10-20 64 views
5

如何在所有使用GWT的div元素上添加事件处理程序? 我试着下面的代码,但窗口的警报将不会解雇了(但“etvoila”级设置):GWT:在所有div元素上添加事件处理程序

private NodeList<Element> pageDIVElements; 
    public void initDiv() { 
    MyDIVEventHandler handler = new MyDIVEventHandler(); 
    pageDIVElements = Document.get().getElementsByTagName("div"); 
    for (int i = 0; i < pageDIVElements.getLength(); i++) { 
     Element elem = pageDIVElements.getItem(i); 
     elem.addClassName("etvoila"); 
     com.google.gwt.user.client.Element castedElem = (com.google.gwt.user.client.Element) elem; 
     DOM.setEventListener(castedElem, handler); 
    } 

class MyDIVEventHandler implements EventListener { 
    private Element divElement; 
    @Override 
    public void onBrowserEvent(Event event) { 

    Window.alert("Yeepee"); 
    if (event.equals(Event.ONMOUSEOVER)) { 
     Window.alert("ONMOUSEOVER"); 
     divElement = Element.as(((NativeEvent) event).getEventTarget()); 
     divElement.setPropertyString("background-color", "#C6D4E6"); 
    } else if (event.equals(Event.ONMOUSEOUT)) { 
     divElement = Element.as(((NativeEvent) event).getEventTarget()); 
     divElement.setAttribute("background-color", ""); 
    }else if (event.equals(Event.ONCLICK)) { 
     divElement = Element.as(((NativeEvent) event).getEventTarget()); 
     divElement.setAttribute("background-color", ""); 
     Window.alert("ONCLICK"); 
    } 
    } 
} 

有什么不对这种方法吗?

回答

10

看起来好像你已经选择沉没你希望听者被通知的事件。 在这种情况下,例如我会将以下内容添加到initDiv元素或相关的子项。

DOM.sinkEvents(elem, Event.ONCLICK | Event.ONMOUSEOUT | Event.ONMOUSEOVER); 
+0

如何在代码中使用您的解决方案?我无法让它工作。 – djondal 2010-10-21 12:14:37

+0

在“DOM.setEventListener(castedElem ...” : DOMsinkEvents(castedElem,Event.ONCLICK | Event.ONMOUSEOUT | Event.ONMOUSEOVER); – 2010-10-21 12:23:29

+0

之前添加以下内容:您需要将elem强制转换为com.google。 gwt.user.client.Element – 2011-09-27 15:01:43

2

类似于this question,你可以在一个Label包裹。

NodeList<Element> elems = Document.get().getElementsByTagName("div"); 
for (int i = 0; i < elems.getLength(); i++) { 
    Element elem = elems.get(i); 
    Label l = Label.wrap(elem); 
    l.addClickHandler(new ClickHandler() { 
    @Override 
    public void onClick(ClickEvent event) { 
     Window.alert("yay!"); 
    } 
    }); 
} 
+0

代码编译(在纠正get(i)到getItem(i)时),但执行时会抛出以下错误 java.lang.AssertionError:具有现有父窗口小部件的窗口小部件可能没有被添加到分离列表 com.google.gwt.user.client.ui.Label.wrap(Label.java:79)。是否真有可能将此元素包装到标签中? – djondal 2010-10-21 12:18:28

相关问题