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

aw *_*rud 9 javascript jquery internet-explorer

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

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

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

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

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

<script type="text/javascript">
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");
}
</script>
Run Code Online (Sandbox Code Playgroud)

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

小智 16

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

if (typeof(CollectGarbage) == "function")
    CollectGarbage();
Run Code Online (Sandbox Code Playgroud)

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

随着博客称,GC是不可预测的,所以删除数据数据= NULL不会立即回收内存,但它最终将收回它.


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


Dav*_*och 7

使用

$("#result-div").html(data);
Run Code Online (Sandbox Code Playgroud)

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

你有没有尝试过:

delete data;
Run Code Online (Sandbox Code Playgroud)

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