Javascript getJSON';internet断开时未调用s失败事件

Javascript getJSON';internet断开时未调用s失败事件,javascript,jquery,json,internet-explorer,cross-domain-policy,Javascript,Jquery,Json,Internet Explorer,Cross Domain Policy,我在两台计算机上全天候运行单个网页。一台计算机运行的是IE8,另一台运行的是IE9。此网页上有一个javascript计时器,它运行$.getJSON来检索跨域JSON对象。$.getJSON在正常情况下工作正常,但其中一台计算机上的internet连接可能会暂时中断。由于我正在使用$.getJSON检索网页的新内容,因此如果互联网暂时关闭,旧内容将显示出来 我的问题是,我假设在调用$.getJSON时,如果internet宕机,则会触发$.getJSON的失败事件。在这种情况下,将设置一个新的

我在两台计算机上全天候运行单个网页。一台计算机运行的是
IE8
,另一台运行的是
IE9
。此网页上有一个javascript计时器,它运行
$.getJSON
来检索跨域
JSON对象。
$.getJSON
在正常情况下工作正常,但其中一台计算机上的internet连接可能会暂时中断。由于我正在使用
$.getJSON
检索网页的新内容,因此如果互联网暂时关闭,旧内容将显示出来

我的问题是,我假设在调用
$.getJSON
时,如果internet宕机,则会触发
$.getJSON
失败事件。在这种情况下,将设置一个新的计时器,尝试在X分钟内检索
JSON
(它永远不会停止尝试)。测试时,我禁用了internet连接,但
fail
事件中的代码没有触发

在没有internet连接的情况下,
是否会失败
?如果是这样的话,你会推荐什么来防止我的JavaScript在互联网关闭时永久停止


(我看到的一种方法是在JSON调用之前检查internet连接,但是我读过
window.navigator.onLine
是不可靠的,我找不到任何其他解决方案)

getJSON
只是
ajax
的缩写,已经设置了一些值。而且
ajax
有一个
timeout
选项。这可能是最可靠的选择(但显然不会立即响应网络故障)。我个人会将其与您可以找到的任何检查结合起来,以确定网络状态

$.ajax({
    dataType: "json",
    url: url,
    data: data,
    success: success,
    timeout: 10000 // 10 seconds
});

这可能会有所帮助:或者您可以添加一个带有如下库的“Isofline”回调:实际上,在您的特定情况下,只需将超时设置为您想要的任何重试间隔,并让错误处理程序直接重试请求(如果错误是超时),或者使用
setTimeout('tryAgainFunction()',0)
(不确定jQuery如何在内部工作,但如果不这样做,您可能会得到不断增加的内存占用)。为什么要将
tryAgainFunction()
放入超时?这与变量作用域有关。据我所知,
函数a(){var I;a()}
在循环时将创建越来越多的
I
变量,但
函数a(){var i;setTimeout('a()',0)}
将只包含最后一个(使用引号将被调用函数放入不继承作用域变量的
eval
环境中)。
函数a(){var i;setTimeout(a,0)}
将创建更多的
i
变量。您是否需要它取决于jQuery内部处理问题的方式。@noahnu您没有使用JSONP或脚本请求,所以不要担心这一点。在这种情况下,我不认为
设置超时(…,0)
是必要的,因为
错误
处理程序将被“fresh”调用调用堆栈——调用堆栈将不包括调用
$.ajax()
的代码。