IE中“启用本机XMLHTTP支持”选项的目的是什么?

时间:2012-04-27 09:14:56

标签: javascript ajax internet-explorer memory-leaks xmlhttprequest

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

通过在IE的Advnaced选项卡中启用选项Enable native XMLHTTP support可以解决问题。由于我们优先于ActiveXObject上的原生XMLHTTP对象,因此可能由于使用ActiveXObject而导致异常。但仍然不确定可能是什么根本原因或是否还有其他更好的方法来解决问题。我们使用IE8。我们从未在其他浏览器(Firefox和Chrome)中遇到任何此类问题。感谢

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

IE中的“启用本机XMLHTTP支持”选项,毫不奇怪,使得IE为XMLHTTPRequest提供本机支持。如果你不启用它,你将只有IE中的MSXML库的旧版ActiveX绑定。我猜你使用了一些这个库提供跨浏览器处理,用于缺少本机支持的情况(关闭设置或只有传统接口的旧IE)或手动回退到MSXML。由于MSXML绑定是JavaScript的外来接口,因此有许多引入对象的地方从外部JS可以与本机对象形成交叉引用,不要让JS或ActiveX垃圾收集器回收它们,因为它们不通信而且找不到这样的循环引用。

在我看来,最好的解决方案是推荐IE7用户始终使用此选项(它实际上没有任何缺点)并且忘记了旧浏览器。如果这不是某种选择,请尝试递归清除您在后备代码中创建的所有MSXML对象。

答案 2 :(得分:1)

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

您需要在请求完成时取消挂起事件并取消引用XMLHttp对象。 (要取消引用它们,请确保没有JavaScript对象或变量引用它们,包括onClick处理程序中的一小部分脚本等。

启用本机XMLHTTPRequest意味着外部组件被从循环中取出,因此DOM能够自己管理请求生存期。

另见@ PeterAronZentai的答案。