2010-10-20 6 views
5

Wie fügt man einen Event-Handler für alle div-Elemente mit GWT hinzu? Ich habe versucht, den folgenden Code, aber die Fenster Warnungen werden nicht gefeuert (Aber „etvoila“ Klasse eingerichtet ist):GWT: Fügen Sie einen Event-Handler für alle div-Elemente hinzu

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"); 
    } 
    } 
} 

Was bei dieser Methode ist falsch?

Antwort

10

Es sieht so aus, als ob Sie die Ereignisse, an die der Listener benachrichtigt werden soll, versenkt haben. In diesem Fall würde ich zum Beispiel initDiv dem Element oder den relevanten Kindern hinzufügen.

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

Wie verwenden Sie Ihre Lösung im Code? Ich kann es nicht funktionieren lassen. – djondal

+0

Fügen Sie Folgendes vor der Zeile "DOM.setEventListener (castedElem ..." : : DOM.sinkEvents (castedElem, Event.ONCLICK | Event.ONMOUSEOUT | Event.ONMOUSEOVER); –

+0

Sie müssen Elem zu com.google umwandeln. gwt.user.client.Element –

2

Ähnlich this question, können Sie es in einer Label wickeln.

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

Der Code kompiliert (beim Korrigieren von get (i) zu getItem (i)), aber beim Ausführen wird der folgende Fehler ausgelöst: java.lang.AssertionError: Ein Widget, das über ein vorhandenes übergeordnetes Widget verfügt nicht hinzugefügt werden, um die Trennliste at com.google.gwt.user.client.ui.Label.wrap (Label.java:79). Ist es wirklich möglich, dieses Element in ein Label zu wickeln? – djondal

Verwandte Themen