对GWT小部件的未知引用阻止清除分离的DOM树

对GWT小部件的未知引用阻止清除分离的DOM树,dom,gwt,google-chrome-devtools,Dom,Gwt,Google Chrome Devtools,我有一个GWT 2.4应用程序,在其中我通过在RootPanel上切换一个复合小部件来交换视图,分别使用常用的RootPanel.get.clear和RootPanel.get.addnewWidget来删除和添加 第一个复合小部件包含一个PasswordTextBox。它侦听Enter键,这将触发交换。不要太花哨: getDisplay().getPasswordBoxForKeyPresses().addKeyPressHandler(new KeyPressHandler() {

我有一个GWT 2.4应用程序,在其中我通过在RootPanel上切换一个复合小部件来交换视图,分别使用常用的RootPanel.get.clear和RootPanel.get.addnewWidget来删除和添加

第一个复合小部件包含一个PasswordTextBox。它侦听Enter键,这将触发交换。不要太花哨:

getDisplay().getPasswordBoxForKeyPresses().addKeyPressHandler(new KeyPressHandler() {
    public void onKeyPress(KeyPressEvent event) {
        if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER) {
            swapWidgets(); // clear RootPanel and add new widget
        }
    }
});
问题是存在DOM内存泄漏:在调用RootPanel.get.clear之后,旧的复合小部件被卡在分离的DOM树中,因为PasswordTextBox的HTMLInputElement有一些奇怪的引用,我无法识别

更新: 我接受了下面的有用建议,在style=detailed处编译,并开始尝试在树下查找对JS中元素的引用。我对GWT还很陌生,所以我还不清楚到底发生了什么。从保留树中的第二行开始,我可以看到_2中的lastEvent包含树顶部列出的nativeKeyTarget。但我该怎么办呢?

我追踪到了SmartGWT的引用。它跟踪ISC_Core.js中的最后一次单击事件。进一步的问题是

这种行为将如何进一步影响我的应用程序中的内存使用? 如果需要,可以绕过此行为吗?
但这些问题是另一个帖子

看起来您可能没有跟踪处理程序注册,这将导致内存泄漏、阻止对象恢复并导致幻象事件捕获

在纯GWT中,它看起来是这样的

// class member
HandlerRegistration reg;

// save for recovery
reg = getDisplay().getPasswordBoxForKeyPresses().addKeyPressHandler(...);

public void onDetatch() {
// recover memory
reg.removeHandler();
reg = null;
}
// class member
GroupingHandlerRegistration regs = new GroupingHandlerRegistration();
// save for later recovery
regs.add( getDisplay().getPasswordBoxForKeyPresses().addKeyPressHandler(...) );
// recover memory
regs.removeHandler();
GXT有一个很好的分组功能,可以防止注册扩展,它看起来是这样的

// class member
HandlerRegistration reg;

// save for recovery
reg = getDisplay().getPasswordBoxForKeyPresses().addKeyPressHandler(...);

public void onDetatch() {
// recover memory
reg.removeHandler();
reg = null;
}
// class member
GroupingHandlerRegistration regs = new GroupingHandlerRegistration();
// save for later recovery
regs.add( getDisplay().getPasswordBoxForKeyPresses().addKeyPressHandler(...) );
// recover memory
regs.removeHandler();

对于GroupingHandlerRegistration

为什么不继续跟随对话框的保留树部分查看其存储位置?使用style=PRETTY编译,您将能够读取已编译的GWT代码,并查看其他变量/字段是什么。继续扩展项目,以查看它何时挂回您的应用程序或您可能正在使用的某个库,如果您还不知道发生了什么,请发布这些结果。您提到PasswordTextBox是Composite 1的一部分吗?这一点也不奇怪,它有一个对composite1的父引用。=>只要在代码中的某个地方保留对PasswordTextBox的引用,就无法摆脱Composite 1。@ChrisLercher我同意……某个地方一定有引用。据我所知,Composite1小部件的演示者实际上是一个视图小部件的混合体,已经超出了范围。“这是我能想到的唯一一个可以引用密码文本框的地方。@ColinAlworth,好主意。”。我将开始挖掘并用保留树数据更新原始帖子。