2010-06-20 98 views
8

可以說我有一個自定義的小部件,它有一個ClickHandler。這裏的例子:GWT添加ClickHandler到DOM元素

public class TestWidget extends Composite { 

private static TestWidgetUiBinder uiBinder = GWT 
     .create(TestWidgetUiBinder.class); 

interface TestWidgetUiBinder extends UiBinder<Widget, TestWidget> { 
} 

@UiField 
Button button; 

public TestWidget(String firstName) { 
    initWidget(uiBinder.createAndBindUi(this)); 
    button.setText(firstName); 
} 

@UiHandler("button") 
void onClick(ClickEvent e) { 
    Window.alert("Hello!"); 
} 

}

當我嘗試添加這個小部件是這樣的:

TestWidget testWidget = new TestWidget("myTestWidget"); 
    RootPanel.get().add(testWidget); 

一切都很好。如果我點擊我的按鈕,我會收到我期望的消息。 但是如果我添加這樣的:

TestWidget testWidget = new TestWidget("myTestWidget"); 
    RootPanel.getBodyElement().appendChild(testWidget.getElement()); 

我的點擊事件不會被解僱。我很努力地理解爲什麼。 如果有人能向我解釋這個或者將我鏈接到一個資源,我可以閱讀這些資料,那將會很好。最後,我想知道是否有可能添加clickhandler後,我附加了子事件,如果這種方式被推薦。感謝它提前尋求幫助。

褲褲

回答

7

當你調用add()Widget.onAttach()叫上正在添加到面板的小部件。 onAttach會做一些工作來註冊widget以接收事件。 appendChild()只需將一個DOM元素附加到另一個DOM元素上,而不需要做任何其他操作。你應該能夠這樣做是爲了獲得在第二種情況下工作的事件:

Element element = testWidget.getElement(); 
RootPanel.getBodyElement().appendChild(element); 
DOM.sinkEvents(element, 
    Event.getTypeInt(ClickEvent.getType().getName()) 
    | DOM.getEventsSunk(element); 

但是,我沒有測試過這一點,我不建議你在實際應用中使用它。使用add()絕對是首選,使用appendChild()這種方式沒有優勢,可能會導致意想不到的行爲。