【问题标题】:GWT adding a ClickHandler to a DOM elementGWT 将 ClickHandler 添加到 DOM 元素
【发布时间】:2010-06-20 22:19:23
【问题描述】:

假设我有一个具有 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!");
}

}

当我尝试像这样添加这个小部件时:

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

一切都很好。如果我点击我的按钮,我会收到我期望的消息。 但是,如果我像这样添加它:

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

我的点击事件没有被触发。我正在努力理解为什么。 如果有人可以向我解释这一点或将我链接到我可以阅读的资源,那就太好了。最后,我想知道是否可以在添加子事件之后添加 clickhandler,以及是否推荐这种方式。提前感谢它的帮助。

库库

【问题讨论】:

    标签: gwt


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-17
      • 2018-01-21
      • 1970-01-01
      • 2012-05-31
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      相关资源
      最近更新 更多