Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Ajax客户端控件-内存泄漏_Javascript_Asp.net_Memory Leaks_Asp.net Ajax - Fatal编程技术网

Javascript Ajax客户端控件-内存泄漏

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

我正在ASP.Net中创建一个Ajax客户端控件。通过从IScriptControl继承,然后添加相关的javascript类(将从javascript控件继承)。我在以下代码中发现内存泄漏:

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完成的。