2010-10-20 117 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

相關問題