我创建了一个对话框,其中有一些带有事件的按钮。当我以递归编程方式销毁对话框或按 X 时,是否删除了所有创建的事件监听器(隐藏、取消、click1、click2)?
因为我经常(针对不同的对话框)调用这部分(这里我只发布了代码的简化版本),并且我的代码似乎可能存在一些内存泄漏,我想消除它们。所以请告诉我,像 eventHide.remove(); 这样自己删除事件监听器是否有必要/有意义?
另外:我尝试使用 on (如 eventHide)来执行点击和取消事件,但它不起作用。
var myDialog = new Dialog({
content: 'Testdialog'
});
myDialog.show();
var btn1 = new dijit.form.Button({ label: "Ok" });
var btn2 = new dijit.form.Button({ label: "Help" });
myDialog.containerNode.appendChild(btn1.domNode);
myDialog.containerNode.appendChild(btn2.domNode);
var eventHide = on.once(myDialog, "hide", function(e){
console.log('hide');
myDialog.destroyRecursive();
});
dojo.connect(btn1, "onClick", function(){
console.log('click ok');
myDialog.destroyRecursive();
});
dojo.connect(btn2, "onClick", function(){
console.log('click help');
myDialog.destroyRecursive();
});
dojo.connect(myDialog, "onCancel", function(){
console.log('cancel');
});
最佳答案
您可以使用 dijit/Destroyable 中定义的 this.own
,它是 dijit/_WidgetBase 以及大多数小部件的基础(确保您的自定义小部件继承自 hit。)。
dijit/Destroyable 用于跟踪实例的句柄,然后在实例销毁时销毁它们。
更多信息: http://dojotoolkit.org/reference-guide/1.10/dijit/Destroyable.html
http://dojotoolkit.org/reference-guide/1.8/dojo/Evented.html
关于JavaScript(道场): Is event-listener removed when object is destroyed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43514033/