2012-04-14 135 views
1

我想在監聽器添加鼠標SpanElement中,我用創建人:添加監聽器,則SpanElement

SpanElement span = Document.get().createSpanElement(); 
span.setInnerText("my text"); 

我在谷歌如何與標籤的包裝做到這一點發現,但我想這樣做沒有任何包裝。可能嗎?

謝謝。

+0

是的,它可以使用JSNI。你爲什麼不想使用隱藏JSNI複雜性的包裝類? – 2012-04-14 09:34:29

+0

@GuillaumePolet因爲我在其他情況下遇到了這個問題,所以我想知道GWT如何處理低級別的事件。 – Elijah 2012-04-14 13:04:17

回答

7

也可以沒有JSNI。

因此,與你的元素:

SpanElement span = Document.get().createSpanElement(); 
span.setInnerText("my text"); 

直接添加事件偵聽器,元素:

Event.sinkEvents(span, Event.ONCLICK); 
Event.setEventListener(span, new EventListener() { 

    @Override 
    public void onBrowserEvent(Event event) { 
     if(Event.ONCLICK == event.getTypeInt()) { 
      //do your on click action 
     } 
    } 
}); 

...它看起來非常難看;) 當你看到 - 事件監聽器這個元素構想的所有dom事件都是「共同的」。因此爲了確保處理正確的事件,您應該檢查事件類型(當您沉沒多個事件類型時(這次是開銷 - 因爲我們只沉沒了CLICK事件的位)。至於沉沒 - >這初始化參與gwt全球dom事件調度系統的元素 - 事件是全局處理的,以減少關閉的次數,以便儘量減少舊IE瀏覽器的內存泄漏。 還有一件事。每個元素只能設置一個事件監聽器 - 如果您設置了新的監聽器,它會覆蓋前一個。所以我假設somwehere以後要鼠標懸停監聽器添加到您的跨度,而不是清償媒體鏈接添加點擊監聽,你可能會做這樣的事情:在一次

//add mouseover event bit to existing sunk event bits 
Event.sinkEvents(span, Event.getEventsSunk(span) | Event.ONMOUSEOVER); 
final EventListener oldListener = Event.getEventListener(span); 
Event.setEventListener(span, new EventListener() { 

    @Override 
    public void onBrowserEvent(Event event) { 

     if(Event.ONMOUSEOVER == event.getTypeInt()) { 
      //your mouseover action 
     } 

     if(oldListener != null) { 
      oldListener.onBrowserEvent(event); 
     } 
    } 
}); 

或添加更多的事件:

//add mouseover event bit to existing sunk event bits 
Event.sinkEvents(span, Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT); 
Event.setEventListener(span, new EventListener() { 

    @Override 
    public void onBrowserEvent(Event event) { 

     switch(event.getTypeInt()) { 
      case Event.ONCLICK: 
       break; 
      case Event.ONMOUSEOVER: 
       break; 
      case Event.ONMOUSEOUT: 
       break; 
     } 
    } 
}); 

Label.wrap(span).addClickHandler(new ClickHandler() { 

    @Override 
    public void onClick(ClickEvent event) { 
     //do your on click action 
    } 
}); 

而且過去的事情,即使你不願意做的不要怕小部件;

所以說,所有你使用一個標籤控件包裹你的跨度大概aprecciate後M編程 - 將它們看作是jquery節點包裝器對象。他們並不沉重,但給了很多權力。 您還可以直接在現有DOM元素上包裝小部件,而不將它們附加到「面板基礎結構」。

+0

非常感謝! – Elijah 2012-04-14 13:05:34

+0

應該做的一點 - 確保在分離時或者在頁面加載時清空事件偵聽器,或者在某些瀏覽器中創建內存泄漏。這就是GWT不鼓勵這種策略的原因。有關更多詳細信息,請參閱http://code.google.com/p/google-web-toolkit/wiki/DomEventsAndMemoryLeaks。 – 2012-04-14 15:34:01

+0

@Colin - 您指的是在使用Widget封裝現有的DOM元素時分離的小部件?對於作爲Label的「標準」小部件,wrap方法通過'RootPanel.detachOnWindowClose(instance);'來關心它,如果你編寫了一個你想在DOM編程中使用的自定義小部件,你應該提供類似於靜態包裝方法使用構造函數「請參閱http://stackoverflow.com/a/10142574/1010868 – 2012-04-14 16:14:53