3

假设我的网站上有这个脚本标签(从 SO 借来的)。

<script type="text/javascript" async="" 
      src="http://edge.quantserve.com/quant.js"></script>

如果edge.quantserve.com在没有返回 404 的情况下出现故障或停止响应,那么在页面的其余部分加载之前是否必须等待超时?我在想 Chaos Monkey 出现并炸毁了我的网站所依赖的服务器,该服务器不是 CDN 的一部分并且故障转移很差。

处理此问题的行业标准方法是什么?我在 SO 上找不到骗子,也许我正在寻找错误的术语。

更新:我应该更仔细地查看 SO 代码,底部有这个:

<script type="text/javascript">var _gaq=_gaq||[];_gaq.push(['_setAccount','UA-5620270-1']);
        _gaq.push(['_setCustomVar', 2, 'accountid', '14882',2]); 
_gaq.push(['_trackPageview']);
    var _qevents = _qevents || [];
    (function(){
        var s=document.getElementsByTagName('script')[0];
        var ga=document.createElement('script');
        ga.type='text/javascript';
        ga.async=true;
        ga.src='http://www.google-analytics.com/ga.js';
        s.parentNode.insertBefore(ga,s);
        var sc=document.createElement('script');
        sc.type='text/javascript';
        sc.async=true;
        sc.src='http://edge.quantserve.com/quant.js'; 
        s.parentNode.insertBefore(sc,s);
    })();
    </script>

好的,所以如果quant.js文件加载失败,它会创建一个带有ga.async=true;. 也许这就是诀窍。

可能的答案:https ://stackoverflow.com/a/1834129/30946

4

3 回答 3

1

在您的服务器上复制该文件并使用它。仅当来自服务器的副本无法加载时,它才会加载您的副本

<script src="http://edge.quantserve.com/quant.js"></script>
    <script>window.quant || document.write('<script src="js/quant.js"><\/script>')</script>
于 2012-07-31T21:28:36.507 回答
1

一般来说,把它做好并且跨浏览器是很棘手的。

一些建议:

  1. 将脚本移动到 HTML 页面的最底部(以便在您请求该脚本之前显示几乎所有内容)
  2. 将其移至底部并包裹在<script>document.write("<scr"+"ipt src='http://example.org/script.js'></scr"+"ipt>")</script>或更新后添加的方式(document.createElement('script')
  3. 最后一个选项是通过 XHR 加载它(但这仅适用于同域,或仅当在第三方服务器上启用了 CORS 时才适用于跨域);然后,您可以使用timeoutXHR 的属性(对于 IE 和 Fx12+),并在其他浏览器中,使用setTimeout并检查 XHR 的readyState. 它现在有点复杂且非常非跨浏览器,所以选项 2 看起来最好。
于 2012-07-31T21:56:12.340 回答
0

要回答您关于浏览器必须等待脚本在页面的其余部分加载之前加载的问题,答案通常是否定的。典型的浏览器会有多个线程来处理页面和链接内容(CSS、图像、js)的下载。所以应该加载页面的其余部分,尽管用户的浏览器指示器仍然会显示页面正在尝试加载,直到最终请求完成或超时。

根据您尝试加载的资源的性质,这显然会对您的页面产生不同的影响。通常,如果您担心这一点,您可以将所有文件托管在一个通用 CDN 上(或者您的网站,如果它不是那么高流量),这样至少如果有一件事情失败了,很可能一切都失败了,而您有一个更大的问题要应对:)

于 2012-07-31T21:32:22.790 回答