2010-06-20 96 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()这种方式没有优势,可能会导致意想不到的行为。