使用 Jquery 自动完成时的 IE11 内存泄漏 (asp.net)

Posted

技术标签:

【中文标题】使用 Jquery 自动完成时的 IE11 内存泄漏 (asp.net)【英文标题】:IE11 memory leak when using Jquery autocomplete (asp.net) 【发布时间】:2016-01-16 02:30:12 【问题描述】:

我有一个 asp.net 网页,它使用 Jquery 自动完成功能通过在每个字段上使用 class="cur" 来显示许多文本框(超过 75 个文本框)上的选项列表。

我注意到,在 IE 9-11 中每次刷新页面时,内存每次都会增加 3-5Mb(甚至更多)。一旦达到 250,000K 或更多,性能就会受到影响,一切都会变慢很多(需要几秒钟来输入文本框,刷新等)

如果我从页面中取出自动完成,那么它工作正常(几乎不会增加 IE 的内存)。

所以我假设内存泄漏是由于 jquery 自动完成功能而发生的。

在我正在使用的 jquery 代码下方找到(我已经缩短了货币选项的数量)。

那么问题来了,如何在使用 jquery 自动完成时避免内存泄漏?

更新:请注意,我在 Sys.Application.add_load(function () 中有 jquery 脚本,因为它只运行第一次回发,之后所有自动完成功能都将停止工作。

Sys.Application.add_load(function () 


 $('.cur').each(function () 
        var currencies = [
                                  value: 'USA dollar', data: 'USD' ,
                                  value: 'European euro', data: 'EUR' ,
                                  value: 'South African rand', data: 'ZAR' ,
                                  value: 'Mexican peso', data: 'MXN' ,
                                  value: 'Japanese yen', data: 'JPY' ,
                                  value: 'Indian rupee', data: 'INR' ,
                                  value: 'Indonesian rupiah', data: 'IDR' ,
                                  value: 'Chinese renminbi', data: 'CNY' ,
                                  value: 'Canadian dollar', data: 'CAD' ,
                                  value: 'Brazilian real', data: 'BRL' ,
                                  value: 'Australian dollar', data: 'AUD' ,
                                  value: 'New Zealand dollar', data: 'NZD' ,
                                  value: 'Afghan afghani', data: 'AFN' ,
                                  value: 'Albanian lek', data: 'ALL' ,
                                  value: 'Vietnamese dong', data: 'VND' ,
                 ...many more currencies
                                  value: 'Yemeni rial', data: 'YER' ,
                                  value: 'Zambian kwacha', data: 'ZMK' ,
                                  value: 'Zimbabwean dollar', data: 'ZWD' ,
        ];




        var txt = $(this);
        txt.autocomplete(
            source: currencies,
            delay: 0,
            minLength: 0,
            select: function (event, ui)  $(this).val(ui.item.data); return false ,
            change: function (event, ui)  $(this).trigger("change") 
        ).bind('focus', function () 
            $(this).autocomplete("search");
        )
    );


【问题讨论】:

1-.包括您如何测量内存足迹。 2-引用“每次刷新页面”是F5刷新,请为我清除。 3-。你说它不会在 chrome 中发生?...如果您刷新整页会发生什么...在开发人员选项中禁用 IE 中的缓存,看看会发生什么。 4- 您可以将这些更改为 ajax 调用而不是嵌入的页面变量,这将大大缩短页面加载时间并减少页面内存占用。 感谢您的反馈。刷新我的意思是回发。每次我按下 gridview 行、更新记录等时。我在 IE11 中使用开发者工具,现在包括一个内存选项卡来检查可能的内存泄漏等。它也发生在 Firefox 中(我无权访问铬合金)。我无法进行整页刷新(使用 F5?),因为这会因各种原因使页面停止工作并且需要再次登录。在 IE 中禁用捕获已经开启。更改 ti ajax 调用将花费我更长的时间(重新编程),我希望找到一个更简单的解决方案。谢谢。 进一步,请注意,我更新了我的问题,其中包含有关 Sys.Application.add_load(function () 中的 jquery 脚本的更多信息。如果不是,则只运行一次。以防万一与此有关。 +1 的问题,因为我也面临 jQuery 自动完成泄漏内存问题。我使用了 IE-11 开发工具 msdn.microsoft.com/en-us/library/dn255003(v=vs.85).aspx 并在关闭后留下了更多的内存和对象。 【参考方案1】:

您使用 ASP.net

我相信您的问题更多是与 ASP.net 缓存有关,而不是与 javascript 有关。

ASP.net 页面缓存

看了好久,具体内容记不清了。

但它类似于;表单帖子值被缓存到页面中。

请确认是这个还是不是这个?

由于您使用 ASP.net 的次数比我多,如果您是一位资深的 ASP.net 用户,那么您将确切地知道我在说什么,如果不是,我们将不得不谷歌搜索并挖掘它。 ..(在我这边,一个快速的谷歌没有找到我要找的东西)。

更新

Google ViewState 在 asp.net 中,对我来说,这很可能是您遇到的问题的原因。

找到它: http://www.freshegg.co.uk/blog/web-design/responsive-design/creating-lean-fast-web-pages-view-state

更新

 currencies = [
      value: 'USA dollar', data: 'USD' ,
      value: 'European euro', data: 'EUR' ,
    ...many more currencies
];

Sys.Application.add_load(function () 
    $('.cur').each(function () 
            var txt = $(this);
            txt.autocomplete(
                source: currencies,
                delay: 0,
                minLength: 0,
                select: function (event, ui)  txt.val(ui.item.data); return false ,
                change: function (event, ui)  txt.trigger("change") 
            ).bind('focus', function () 
                txt.autocomplete("search");
            )
        );
    

【讨论】:

感谢您对此进行调查。我不认为是viewstate的问题,其实我检查了各种回发,viewstate数据量是一样的……服务器返回的文件大小总是一样的……所以问题(我认为)必须在其他地方...... 哦! dam ...我以为我有它;-)我想多了。 进一步 jquery/javascript 代码在一个单独的页面上......它已经缓存在客户端的计算机中,因此不应该是服务器返回的 aspx 页面的一部分......它看起来就像 jquery 函数被应用到这么多文本框(> 75)浏览器不喜欢它......如果我关闭 jquery 则页面行为正常所以(我相信)问题必须与 jqueryasp .net 问题... @user1135218 查看答案更新,为了进一步帮助,我需要查看 'Sys.Application.add_load(function () ' 来自或被调用的位置

以上是关于使用 Jquery 自动完成时的 IE11 内存泄漏 (asp.net)的主要内容,如果未能解决你的问题,请参考以下文章

IE 事件传播与 jQuery 自动完成/jScrollPane 的行为不符

占位符在页面加载时打开 jQuery UI 自动完成组合框(IE10)

Excel VBA在IE11中使用自动完成填充文本框

如何控制 IE6+jQuery+jQuery-ui 内存泄漏?

使用多个分隔符的自动完成功能在 IE 中不起作用

IE6 中 jQuery 对话框的修复或解决方法 - 对话框包含表单时的主要布局问题