2009-02-25 98 views
2

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

我设法处理服务器故障,其中第一个服务器返回一个错误,但我也想处理超时 - 如果第一台服务器花费太多时间来响应我想中止负载并切换到备用服务器。

我遇到的问题是,我可以设置一个超时来触发切换到备用服务器的方法,但是备用服务器的脚本不会成功加载,直到浏览器本身在原始请求中超时 - 这对我的需求来说太长了。

我希望能够在加载第一个<脚本标记时中止加载并添加指向备用服务器的第二个<脚本标记。

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

这一切都在Firefox上尝试 - 我还没有尝试过IE,但解决方案必须在两者上都能正常工作。我很乐意听到任何建议。

回答

2

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

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

jQuery有一个类似的功能,一些开放的要求: http://dev.jquery.com/ticket/1863 http://dev.jquery.com/ticket/3442

+0

我想加载第二个脚本来自同一台服务器(无论如何 - 同一主机名 - 它的负载平衡,所以它可能是一个不同的服务器)。这一切都发生在DOMReady和HEAD元素之后,所以它不会延迟页面渲染。BTW“推迟”仅在IE上受支持。 – Guss 2009-03-04 00:34:32

0

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

+0

可能,但由于上面提到的跨域问题,这是不可行的 – Guss 2009-02-25 20:56:55

+0

哦错过了 - 在那里/你已经排除了这一点..好吧,没关系 – 2009-02-26 06:24:26

0

如果你可以修改真实加载,你可以添加一个回调有脚本。只需在页面顶部设置一个计时器,并在脚本文件的底部清除它。这样,如果您的脚本加载不正确,则在定时器耗尽时执行备份请求。

在你的页面的顶部运行内嵌脚本块如下:

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

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

在你的外部JavaScript文件的底部,只需要调用doneLoading()。如果您的初始请求超过15秒,则会向备份服务器发出新请求。我不认为你可以放弃最初的请求,但是备份请求将按预期执行。