Javascript Ajax客户端控件-内存泄漏
我正在ASP.Net中创建一个Ajax客户端控件。通过从IScriptControl继承,然后添加相关的javascript类(将从javascript控件继承)。我在以下代码中发现内存泄漏:Javascript Ajax客户端控件-内存泄漏,javascript,asp.net,memory-leaks,asp.net-ajax,Javascript,Asp.net,Memory Leaks,Asp.net Ajax,我正在ASP.Net中创建一个Ajax客户端控件。通过从IScriptControl继承,然后添加相关的javascript类(将从javascript控件继承)。我在以下代码中发现内存泄漏: Type.registerNamespace("mynamespace"); myClass = function (element) { myClass.initializeBase(this, [element]); } myClass.prototype = { initia
Type.registerNamespace("mynamespace");
myClass = function (element) {
myClass.initializeBase(this, [element]);
}
myClass.prototype = {
initialize: function () {
myClass.callBaseMethod(this, 'initialize');
var me = this;
$(document).ready(function () {
me._initializeControl();
me._hookupEvents();
});
},
dispose: function () {
//Add custom dispose actions here
myClass.callBaseMethod(this, 'dispose');
},
//...other code ...
_hookupEvents: function () {
var me = this;
var e = this.get_element();
$("#viewRates", e).click(function () {
me.openDialog();
});
},
//...other code...
myClass.registerClass('myClass', Sys.UI.Control);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
_hoookupEvents是我的javascript文件中的一个函数。泄漏与行me.openDialog有关。如果我拆下这根管线,就不会有泄漏。但是,我需要这行代码才能从类中调用函数(我不能在函数中使用'this',因为它会引用按钮)。有更好的方法吗?或者我只需要调用dispose函数中的一些方法来清理这些东西 如果myclass只有两个实例,我非常犹豫是否将其称为内存泄漏。如果有2000个myclass实例,那么肯定存在漏洞。
我会努力搜索您拥有的任何动态实例化语句,它们在特定条件下创建myClass。这就是我经常看到的(在applicationinit的循环中创建类,也许表单提交可以触发实例化,而查看您是否可以获得提交来创建多个对象,等等)问题 正如您所注意到的,此代码处的内存泄漏可能发生在这一行
$("#viewRates", e).click(function () {
me.openDialog();
});
当您使用UpdatePanel调用它时,或者通常为同一组件调用它,并且没有首先清除单击之前的事件时,前面的处理程序将保持启用状态,这里我们有两种情况
- 要注册多个相同的单击事件,请单击多个
- 使用ajax更新dom,而不是清除之前的处理程序,结果是之前的代码将永远保留(永远==直到您离开页面)
- 在添加新的之前
- 在使用UpdatePanel初始化新的ajax调用时,在获得新响应之前
this.get_events().removeHandler('click')代码>您是如何检测泄漏的?你知道泄漏的对象或元素吗?使用chrome开发者工具-堆快照。如果我离开那行代码,我可以看到有两个myclass实例(当我回发时)。我删除了代码行。。。而且只有一个实例(即使在多次回发之后),我想你的意思是回发是用UpdatePanel完成的。