1

我有两个 jsbin 来说明代码:

http://jsbin.com/OdiSApI/1/edit 这将在 IE8 中触发警报 - 此警报位于调用函数 ExecuteSearch 中。

http://jsbin.com/OdiSApI/2/edit 这似乎在 IE8 中运行良好。

注意: 您需要单击右上角窗格中的Run with JS按钮。然后在下拉状态中的文本字段中输入一个城市并提交表单(这会调用谷歌地图地理编码 API)。

第二个链接中的“修复”如下:

//account for asynchronous nature of IE XDR request
//geo_location is undefined here in IE8
//this seems to fix ie8, though I'm not sure why...
var timeout = setTimeout(function() {
    clearTimeout(timeout);
}, 10);

我遇到的问题是我必须为 IE8-9 使用 XDomainRequest (XDR)(部分 CORS 支持)。在第一个 jsbin 中,我在我的 ExecuteSearch 函数中点击了警报,因为我的 GeoCode 函数在我的 xdr.onload 触发之前返回。

超时似乎正在排队我的异步 XDR,尽管我不确定发生了什么以及为什么超时似乎是我的灵丹妙药。

有人有想法么?

4

1 回答 1

1

setTimeout 不能解决问题。

实际发生的情况是 IE8 在 XDomainRequest 对象中存在一个错误,在该对象中,当挂起的请求打开时,它会受到垃圾收集的影响。

如果您查看原始源代码,“xdr”变量会在调用 send() 后立即超出范围。这不应该是一个错误,但 IE8 注意到该变量现在从未从任何地方引用。如果你不走运,垃圾收集器将在 send() 异步完成之前运行,并将对象从你下面删除。

setTimeout 似乎起作用的原因是因为它将 XDR 对象保持在范围内的时间稍长。它似乎有效,但实际上并不能解决问题 - 竞争条件仍然存在,如果垃圾收集器稍后运行,它仍然可以破坏 XDomainRequest 对象。

我在这里发布了一些关于各种 XDomainRequest 问题的详细信息以及解决方法:IE, XDomainRequest not always work

于 2014-12-20T19:14:30.900 回答