7

我们的网站使用 AJAX 调用并用于XMLHTTPRequest实现这一目标。当客户端整天使用单个 IE 实例并在该 IE 中多次导航和重新访问页面时,我们最终会出现内存不足异常并被迫关闭 IE。

通过启用Enable native XMLHTTP supportIE 的高级选项卡中的选项可以解决此问题。由于我们更喜欢原生 XMLHTTP 对象而不是 ActiveXObject,因此异常可能是由于使用 ActiveXObject 引起的。但仍然不确定根本原因是什么,或者是否有其他更好的方法来解决问题。我们使用 IE8。我们从未在其他浏览器(Firefox 和 chrome)中遇到过此类问题。谢谢

4

3 回答 3

6

启用原生 XMLHTTP 支持意味着浏览器不会提供 MSXML.HttpRequest 而是提供符合标准的 window.XMLHttpRequest。然而,我们成功地使用了这两个版本而没有任何泄漏,所以我想这一定是您的代码中的一些实现问题 - 我只是在猜测,但是将 MSXML.HttpRequest 实例固定在 DOMNodes 上(通过事件监听器)可能会导致这种情况。

于 2012-04-27T09:22:07.823 回答
2

"Enable native XMLHTTP support” option in IE, unsurprisingly, makes IE provide native support for XMLHTTPRequest. If you don't enable this, you'll only have legacy ActiveX binding to MSXML library in IE. I guess you use some library that provides cross-browser handling for cases where native support is absent (setting turned off or older IE that only have legacy interface) or manually fallback to MSXML. Since MSXML binding is an alien interface for JavaScript, there are many places where objects introduced from outside JS can form cross-references with native objects, not letting either JS or ActiveX garbage collector to reclaim them, since they don't communicate and can't find such circular references.

Best solution, in my opinion, is to recommend IE7 users to always have this option on (there's really zero drawbacks to it) and just forget about older browsers. If this is not an option somehow, try recursively clear all MSXML objects you create in your fallback code.

于 2012-04-27T09:30:43.967 回答
1

本质上,由于 HTML DOM、JavaScript 执行引擎和 XMLHTTPRequest 对象之间的循环引用,您正在泄漏 XMLHTTPRequest 对象。

当请求完成时,您需要解开事件并取消对 XMLHttp 对象的引用。(要取消引用它们,请确保没有 JavaScript 对象或变量引用它们,包括 onClick 处理程序中的少量脚本等。

启用原生 XMLHTTPRequest 意味着将外部组件从循环中取出,因此 DOM 能够自行管理请求的生命周期。

另请参阅@PeterAronZentai 的回答。

于 2012-04-27T09:27:16.313 回答