2017-03-08 26 views
0

我很難在着名的DOM.appendChild之後捕獲事件。經過多次嘗試使用處理程序後,我發現this answer其中@Õzbek通過偵聽器完成了這項工作。 現在我不明白爲什麼「偵聽器」工作而「處理器」不工作。 作爲代碼的例子:爲什麼Handler在Listener完成工作時不工作?

Button button = new Button("Test button"); 

DOM.appendChild(getElement(), button.getElement()); 
button.addClickHandler(new ClickHandler() { 

    @Override 
    public void onClick(ClickEvent event) { 
     GWT.log("this doesn't work");   
    } 
}); 

DOM.sinkEvents(button.getElement(), Event.ONCLICK); 
DOM.setEventListener(button.getElement(), new EventListener() { 
    public void onBrowserEvent(Event event) { 
     GWT.log("this works perfectly!"); 
    } 
}); 

聽者會工作,但不會處理。

  1. 那麼,是區別beetwen呢?
  2. 如何強制處理程序工作?
  3. 是否有一些方法可以在處理程序上執行此操作?

我想了解監聽器和處理器之間的差異。 I read these answers這表明沒有太大的區別,但我仍然沒有得到它

回答

2

Button是一個小部件而不是一個元素,如果你將它作爲一個元素添加到dom中,你將失去事件。如果您想使用處理程序,您可以將它追加到RootPanel: RootPanel.get().add(button)

如果您要使用元素而不是小部件,您可以使用DOM.createButton(),並使用偵聽器。

2

setEventListener只有當它們「附着」時纔會調用(對於父窗口小部件來說,它本身是附着的,或者延遲直到附着),並且您從不「附着」該按鈕。

用明確的serEventListener完全繞過了小內件(和生命週期)。在這種情況下,你實際上可以使用ButtonElement

TL; DR:不這樣做,這是一個破碎設計的症狀。

+0

但在某些情況下,如果您想擴展TextBox並添加按鈕以顯示某些幫助程序,那麼您沒有其他選項,該監聽程序只有一個選項,對嗎? –

+1

您不需要「擴展文本框並添加按鈕」,就可以在複合窗口小部件中編寫文本框和按鈕。 –