我有两个jsbin说明代码:
http://jsbin.com/OdiSApI/1/edit 这将在IE8中发出警报 - 此警报位于调用函数ExecuteSearch中。
http://jsbin.com/OdiSApI/2/edit 这似乎在IE8中运行良好。
注意:您需要点击右上方窗格中的使用JS运行按钮。然后在文本字段中输入一个位于下拉状态的城市并提交表单(这将调用google maps geocode 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,虽然我不确定发生了什么以及为什么超时似乎是我的神奇子弹。
有人有什么想法吗?
答案 0 :(得分:1)
setTimeout不能解决问题。
实际发生的是IE8在XDomainRequest对象中有一个错误,当一个挂起的请求打开时,它会被垃圾收集。
如果您查看原始源代码," xdr"调用send()后,变量立即超出范围。这不应该是一个错误,但IE8注意到该变量现在从未在任何地方被引用。如果你不走运,垃圾收集器将在send()异步完成之前运行,并从你下面取出对象。
setTimeout似乎起作用的原因是因为它将XDR对象保持在范围内稍长一些。它似乎工作但实际上并没有解决问题 - 竞争条件仍然存在,如果垃圾收集器运行较晚,它仍然可以销毁XDomainRequest对象。
我在此处发布了一些有关各种XDomainRequest问题的详细信息,并提供了解决方法:IE, XDomainRequest not always work