如何在IE中强制进行Javascript垃圾回收? 在AJAX调用和DOM操作之后,IE的行为非常慢

我有一个带有链式下拉菜单的页面。 从第一个select选择一个option填充第二个option从第二个select选择一个option将使用页面上空div上的innerHtml函数返回匹配结果的表。

问题是,一旦我做出选择并且大量数据被带到页面上,页面上的所有后续Javascript运行exception缓慢。 看起来我通过AJAX拉回来填充div所有数据仍然占用了大量内存。 我在调用innerHtml之后尝试将包含AJAX结果的返回对象设置为null但没有运气。

当我使用Javascript将大量数据插入DOM时,Firefox,Safari,Chrome和Opera都没有显示性能下降,但在IE中它非常明显。 为了测试它是一个Javascript / DOM问题而不是一个普通的旧IE问题,我创建了一个页面版本,它返回初始加载的所有结果,而不是通过AJAX / Javascript,并发现IE没有性能问题。

仅供参考,我正在使用jQuery的jQuery.get方法来执行AJAX调用。

编辑这是我正在做的事情:

  function onFinalSelection() { var searchParameter = jQuery("#second-select").val(); jQuery.get("pageReturningAjax.php", {SEARCH_PARAMETER: searchParameter}, function(data) { jQuery("#result-div").get(0).innerHtml = data; //jQuery("#result-div").html(data); //Tried this, same problem data = null; }, "html"); }  

我想要指出,当返回data非常大时,这只会成为一个问题。 它与大小直接相关,因为我能够看到中等大小结果的适度减速,并且当返回几百条记录时只会出现大幅减速。

使用

 $("#result-div").html(data); 

html()利用jQuery的empty方法,该方法非常难以防止内存泄漏。

你有没有尝试过:

 delete data; 

我认为你的代码中存在其他性能问题导致缓慢。 您的返回数据是否使用具有Alpha透明度的png? 我已经看到杀死IE6(当应用alphafilter时)并显着减慢IE7。

您可以使用CollectGarbage函数强制IE中的垃圾收集,例如

 if (typeof(CollectGarbage) == "function") CollectGarbage(); 

本博客文章中详细介绍了JScript垃圾收集器: http : //blogs.msdn.com/ericlippert/archive/2003/09/17/53038.aspx

正如博客所说,GC是不可预测的,因此删除数据data = null 不会立即回收内存,但最终会收回它。


但我怀疑你的性能损失是否真的是由内存使用造成的; 我认为这是DOM渲染的问题。

如果有人不仅对IE感兴趣:

在Gecko强制垃圾收集:

 window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindowUtils) .garbageCollect(); 

链接