GWT节点或元素侦听onAttach事件

时间:2016-07-15 19:09:27

标签: java gwt

有没有办法在GWT节点中处理各种onAttach事件?我想我可以这样做:

Node myDiv = DOM.createDiv();
Magic.setOnAttachEventListener(myDiv, new EventListener() {
  @Override
  public void onEvent(Event event) {
    // ...
  }
}

当我做这样的事情时,应该调用处理程序,

parent.appendChild(myDiv);

假设parent自身附着,即它显示在当前窗口中。

4 个答案:

答案 0 :(得分:2)

我发布第二个答案,因为我知道您无法改变DIV添加到父母的方式。

经过一番搜索,我找到了Mutation events。它们允许您收听DOMNodeInserted事件:

JS:

myDiv.addEventListener("DOMNodeInserted", function (ev) {
    alert('added');
}, false);

在GWT中,您需要使用JSNI方法:

private native void addListener(Element elem) /*-{
    elem.addEventListener("DOMNodeInserted", function (ev) {
        $wnd.alert('added');
    }, false);
}-*/;

它有效,但......已被弃用。您应该使用MutationObserver代替。

不幸的是MutationObserver没有观察到NodeInserted事件。我认为subtree突变观察会起到作用,但它对我没有用。解决方案是观察父母的childList突变:

JS:

// create an observer instance
var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        alert(mutation.type);
    });    
});

// configuration of the observer:
var config = {
    childList: true
};

// pass in the target node, as well as the observer options
observer.observe(elem, config);

而且,对于GWT,你需要将它包装在JSNI方法中(你知道如何)。

观察者回调中的mutation参数是MutationRecord对象。

因此,如果您可以获取父级,请在其上使用MutationObserver并观察childList突变。如果没有,请尝试使用已弃用的Mutation事件。

我知道这不是纯粹的GWT解决方案,但您可以使用GWT方法来处理事件或变异。你只需要像这样调用JSNI形式的JST方法:

[instance-expr.]@class-name::method-name(param-signature)(arguments)

您将在GWT documentation

中找到所有JSNI信息

答案 1 :(得分:1)

GWT中的所有Widget都已实现HasAttachHandlers接口。如果您需要此功能,最好使用Widget而不是Node。

答案 2 :(得分:0)

您可以使用SimplePanelHTMLPanel作为内容使用DIV

在面板上,您可以调用addAttachHandler方法。

如果您需要Element,可以在面板上调用getElement()方法。

此方法仅在您将myDiv作为Panel附加时才有效,因此不是

parent.appendChild(myDiv);

你应该这样做

HTMLPanel.wrap(parent).add(myDiv);

以下是一个示例代码:

    Element parent = RootPanel.getBodyElement();
    SimplePanel myDiv = new SimplePanel();

    // use it as Panel
    myDiv.add(new Label("Hello!"));

    // or use it as an element
    myDiv.getElement().setInnerText("Hello 2!");

    myDiv.addAttachHandler(new Handler() {
        @Override
        public void onAttachOrDetach(AttachEvent event) {
            Window.alert("Attached");
        }
    });

//  parent.appendChild(myDiv.getElement());     // this will not fire the AttachEvent
    HTMLPanel.wrap(parent).add(myDiv);          // this will fire the AttachEvent

答案 3 :(得分:0)

还有“轮询”替代方案可能不是很有效但更容易,请参阅https://stackoverflow.com/a/850995/938899