不了解这个setTimeout如何/为什么修复我的IE8问题

时间:2013-09-03 21:34:36

标签: javascript asynchronous internet-explorer-8 queue settimeout

我有两个jsbin说明代码:

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

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,虽然我不确定发生了什么以及为什么超时似乎是我的神奇子弹。

有人有什么想法吗?

1 个答案:

答案 0 :(得分:1)

setTimeout不能解决问题。

实际发生的是IE8在XDomainRequest对象中有一个错误,当一个挂起的请求打开时,它会被垃圾收集。

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

setTimeout似乎起作用的原因是因为它将XDR对象保持在范围内稍长一些。它似乎工作但实际上并没有解决问题 - 竞争条件仍然存在,如果垃圾收集器运行较晚,它仍然可以销毁XDomainRequest对象。

我在此处发布了一些有关各种XDomainRequest问题的详细信息,并提供了解决方法:IE, XDomainRequest not always work