2

我正在编写一个 JavaScript 小部件,它旨在用于其他网站并从我自己的网站加载其他脚本文件(由于跨域限制,这基本上意味着没有 XHR)。现在我想优雅地处理故障 - 如果一个脚本无法加载,我想从备用服务器加载脚本。

我设法处理了第一台服务器返回错误的服务器故障,但我也想处理超时 - 如果第一台服务器响应时间过长,我想中止负载并切换到备用服务器。

我遇到的问题是我可以设置超时来触发切换到备用服务器的方法,但是在浏览器本身对原始请求超时之前,来自备用服务器的脚本不会成功加载 - 这也是渴望我的需要。

我希望能够 - 当第一个 <script> 标记正在加载时 - 中止加载,并添加第二个 <script> 指向备用服务器的标记。

我尝试将原始脚本的 src 属性设置为 null,甚至使用 removeNode() 从 HEAD 元素中删除标签,但没有效果。

这一切都在 Firefox 上尝试过——我还没有尝试过 IE,但解决方案必须在两者上都有效。我很想听听任何建议。

4

3 回答 3

2

不幸的是,无法取消对标签的请求。从历史上看,浏览器只允许同时向一个主机名发出 2 个请求,因此应该可以从另一台服务器加载第二个脚本。

您是否在 body.onload 之前启动脚本加载?对于正常的页面加载,浏览器在继续之前等待每个脚本加载,因为脚本可以更改文档。如果脚本没有修改文档,您可以使用 defer 属性,以便浏览器在脚本加载时继续呈现文档。

jQuery 有一些关于类似功能的开放请求:http: //dev.jquery.com/ticket/1863 http://dev.jquery.com/ticket/3442

于 2009-03-03T22:14:41.910 回答
0

我在想你可能想要构建你的小部件以使用 XMLHttpRequest,它可以通过 window.setTimeout() 中止。

于 2009-02-25T20:53:51.703 回答
0

如果您可以修改正在加载的脚本,则可以在那里添加回调。只需在页面顶部设置一个计时器,然后在脚本文件底部清除它。这样,如果您的脚本没有正确加载,备份请求将在计时器用完时执行。

在页面顶部的内联脚本块中运行以下命令:

doneLoading = function() {
  clearTimeout(timeout);
}

timeout = setTimeout(function() {
             ... change the .src on the old inline script element here ...
                     }, 15000);

在外部 JavaScript 文件的底部,只需调用doneLoading(). 如果您的初始请求花费的时间超过 15 秒,则会运行对备份服务器的新请求。我认为您不能中止初始请求,但备份请求将按预期执行。

于 2009-03-04T07:34:16.323 回答