GWT将ClickHandler添加到DOM元素

时间:2010-06-20 22:19:23

标签: gwt

假设我有一个自定义小部件,它有一个ClickHandler。这是一个例子:

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

}

当我尝试像这样添加这个Widget时:

    TestWidget testWidget = new TestWidget("myTestWidget");
    RootPanel.get().add(testWidget);
一切都很好。如果我点击我的按钮,我会得到我期望的消息。 但是,如果我这样添加:

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

我的点击事件未被触发。我很难理解为什么。 如果有人可以向我解释这个或将我链接到我可以阅读它的资源,那将是很好的。最后我想知道是否可以添加clickhandler,之后我附加了子事件,如果建议那样。谢谢你提前寻求帮助。

裤裤

1 个答案:

答案 0 :(得分:7)

当您致电add()时,会在添加到面板的小部件上调用Widget.onAttach()。 onAttach做了一些工作来注册小部件来接收事件。 appendChild()只是将一个DOM元素附加到另一个DOM元素,而不执行任何其他操作。通过这样做,您应该能够在第二种情况下获取事件:

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

但是,我没有对此进行测试,我不建议您在实际应用程序中使用它。使用add()绝对是首选,以这种方式使用appendChild()没有任何优势,可能会导致意外行为。