外部Javascript超时

时间:2010-03-08 19:34:10

标签: javascript

我的网站上安装了许多跟踪脚本和Web服务,我注意到其中一个服务出现故障时,它仍然会尝试调用托管在不同服务器上的外部javascript文件。在Firefox,Chrome和其他新浏览器中,当其中一项服务出现故障时似乎没有任何问题。但是,在IE7和IE8中,我的页面在显示所有内容之前不会一直加载和超时。有没有办法在这些javascript调用上添加时间,以防止它们在关闭时破坏我的页面?

3 个答案:

答案 0 :(得分:5)

您可以在使用JS加载页面后动态加载它们。如果JS文件位于不同的服务器上,那么当您执行此操作时,浏览器仍将显示“浏览器忙”指示符,但原始页面将加载。

如果您可以从自己的站点获取JS,可以在页面加载后使用XMLHttpRequest加载它(或者使用您最喜欢的JS库的帮助程序,例如jQuery的$.ajax(...)),然后评估它。这样,提取本身不会显示浏览器忙碌指示符。

要从您自己的网站获取JS,您可以从您的跟踪提供商下载它(这将不会得到官方支持但通常可以正常工作) - 只需记住每隔一段时间重新获取一个新版本 - 或者您可以创建一个在您自己的站点上“转发”服务,该服务从跟踪提供程序获取它并在本地缓存它一段时间。这样你的JS就不会有陈旧的危险。

Steve Souders提供了有关deferred loading of scripts and browser-busy indicators的更多信息。

答案 1 :(得分:2)

尝试添加defer="defer"

  

defer属性提供了一个提示   脚本没有的浏览器   创建任何内容,以便浏览器可以   可选择推迟解释   脚本。这可以提高性能   通过延迟执行脚本直到   在解析正文内容之后   呈现。

修改
这将阻止这些脚本在页面加载之前运行:

function loadjs(filename) {
    var fileref=document.createElement('script');
    fileref.setAttribute("type","text/javascript");
    fileref.setAttribute("src", filename);
}

window.onLoad = function() {
   loadJs("http://path.to.js");
   loadJs("http://path.to2.js");
   ...
}

答案 2 :(得分:2)

如果你需要加载外部脚本并且想要强制执行超时限制,为了避免繁忙指示器运行太长时间,可以使用带有window.stop()和等效IE的setTimeout(): p>

http://forums.devshed.com/html-programming-1/does-window-stop-work-in-ie-1311.html

    var abort_load = function() {
      if(navigator.appName == "Microsoft Internet Explorer") {
          window.document.execCommand('Stop');
      } else {
          window.stop();
      }
    };
    /**
     * Ensure browser gives up trying to load JS after 3 seconds.
     */
    setTimeout(abort_load, 3000);

请注意,window.stop()相当于用户单击其浏览器上的停止按钮。所以通常你只想在页面加载后调用setTimeout(),以确保在它仍在下载图像,css等时不会中断浏览器。

这应该与orip提出的建议相结合,即动态加载脚本,以避免服务器从未响应的最坏情况,导致“浏览器忙”指示器在浏览器超时之前一直处于活动状态(通常超过一分钟)。使用计时器中的window.stop(),您可以有效地指定浏览器尝试加载脚本的时间。

另请注意,setTimeout()的间隔不是由浏览器精确解释的,因此需要多长时间来加载脚本。

此外,使用window.stop()的一个反指示是,如果您的页面通过js滚动到某个位置。您可能愿意接受它,但无论如何,您可以使stop()条件为NOT已经加载了您期望的内容。例如,如果您的外部JS将定义变量foo,您可以执行以下操作:

var abort_load = function() {
  if (typeof(foo) == "undefined") {
    if(navigator.appName == "Microsoft Internet Explorer") {
        window.document.execCommand('Stop');
    } else {
        window.stop();
    }
  }
};

这样,在happy path的情况下(脚本在超时间隔内加载),你实际上并没有调用window.stop()。