我有两个 jsbin 来说明代码:
http://jsbin.com/OdiSApI/1/edit 这将在 IE8 中触发警报 - 该警报位于调用函数 ExecuteSearch 中。
http://jsbin.com/OdiSApI/2/edit 这似乎在 IE8 中运行良好。
注意:您需要单击右上方 Pane 中的使用 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,尽管我不太确定发生了什么以及为什么超时似乎是我的 Elixir 。
大家有什么想法吗?
最佳答案
setTimeout 无法解决问题。
实际发生的情况是,IE8 在 XDomainRequest 对象中存在一个错误,当打开待处理的请求时,该对象会受到垃圾回收的影响。
如果您查看原始源代码,就会发现“xdr”变量在调用 send() 后立即超出范围。这不应该是一个错误,但 IE8 注意到该变量现在从未从任何地方引用。如果你运气不好,垃圾收集器将在 send() 异步完成之前运行,并将对象从你身下清除。
setTimeout 似乎有效的原因是它使 XDR 对象在范围内保持的时间稍长一些。它似乎有效,但实际上并没有解决问题 - 竞争条件仍然存在,如果垃圾收集器稍后运行,它仍然可以销毁 XDomainRequest 对象。
我在此处发布了有关各种 XDomainRequest 问题的一些详细信息以及解决方法:IE, XDomainRequest not always work
关于javascript - 不明白这个 setTimeout 如何/为什么解决我的 IE8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18601879/