使用 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)