有没有办法在GWT节点中处理各种onAttach事件?我想我可以这样做:
Node myDiv = DOM.createDiv();
Magic.setOnAttachEventListener(myDiv, new EventListener() {
@Override
public void onEvent(Event event) {
// ...
}
}
当我做这样的事情时,应该调用处理程序,
parent.appendChild(myDiv);
假设parent
自身附着,即它显示在当前窗口中。
答案 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)
中找到所有JSNI信息
答案 1 :(得分:1)
GWT中的所有Widget
都已实现HasAttachHandlers接口。如果您需要此功能,最好使用Widget而不是Node。
答案 2 :(得分:0)
您可以使用SimplePanel
或HTMLPanel
作为内容使用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。