【问题标题】:How to abort the loading of an external HTML resource, from JavaScript?如何从 JavaScript 中止加载外部 HTML 资源?
【发布时间】:2009-02-25 20:43:47
【问题描述】:

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

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

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

我希望能够 - 当第一个

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

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

【问题讨论】:

    标签: javascript browser dynamic-loading


    【解决方案1】:

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

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

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

    【讨论】:

    • 我正在尝试从同一服务器加载第二个脚本(无论如何,相同的主机名 - 它的负载平衡,因此它可能是不同的服务器)。这一切都发生在 DOMReady 之后和 HEAD 元素中,因此它不会延迟页面呈现。顺便说一句,“延迟”仅在 IE 上受支持。
    • 许多浏览器仍然有最多 2 个同时请求到同一主机名。因此,这可能是阻止您加载第二个脚本的原因 - 如果您正在从同一主机名加载图像或其他内容。尝试创建一个也使用负载均衡器的新子域。
    【解决方案2】:

    我认为您可能希望构建您的小部件以使用 XMLHttpRequest 可以通过 window.setTimeout() 中止。

    【讨论】:

    • 可能,但由于上面提到的跨域问题,这是不可行的
    • 哦错过了——就在上面/你已经排除了这个..好吧,没关系
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 如果脚本无法加载或加载损坏,我可以处理,问题是如果脚本需要永远加载怎么办 - 我想在浏览器超时到期之前提前中止备份.
    • setTimeout() 将从父页面正文中调用。因此,即使(以及何时)第一次尝试失败,计时器也会过期并启动备份请求。
    猜你喜欢
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多