我的网站应该如何妥善处理缺少JavaScript文件?

问题描述:

假设我的网站上有这个脚本标记(从SO借来)。我的网站应该如何妥善处理缺少JavaScript文件?

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

如果edge.quantserve.com下降或停止,不返回404响应,不会那么必须等待页面加载的其余部分之前超时?我在想混沌猴会出现,并将我的站点所依赖的服务器发送出去,这是一个不属于CDN并且故障转移不良的服务器。

解决此问题的行业标准方法是什么?我无法找到这样的蠢事,也许我正在寻找错误的条款。

更新:我应该更紧密地在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

+0

对于像分析这样的东西,确实没有问题。对于其他应用程序级别的脚本,您可能需要提醒用户该问题,或者自动刷新页面。 (Gmail会这样做。) – Brad 2012-07-31 21:24:24

+0

难道你不能回退到本地副本吗? Ex(使用jQuery):'' – j08691 2012-07-31 21:26:39

+0

您是否主要关心外部请求超时之前的漫长等待时间?第一个答案和以上评论解决了另一个问题。 – 2012-07-31 21:29:27

通常,它很难做到这一点,并跨浏览器。

一些建议:

  1. 移动脚本的HTML页面(这样你要求脚本之前,几乎一切都显示)
  2. 它移到底部的最底部,在<script>document.write("<scr"+"ipt src='http://example.org/script.js'></scr"+"ipt>")</script>把它包或者您在更新后添加的方式(document.createElement('script')
  3. 最后一个选项是通过XHR加载它(但只有在CORS在第三方服务器上启用时,它才适用于同域或跨域);然后您可以使用XHR的timeout属性(用于IE和Fx12 +),并在其他浏览器中使用setTimeout并检查XHR的readyState。目前这是一种令人费解且非常不跨浏览器的方式,所以选项2看起来最好。
+0

我认为你是对的。在查看SO加载的方式之后,第一个GET返回带有惰性脚本加载器的HTML(您的答案#2,带有document.createElement('script')。我怀疑这是其他'big联赛'做到这一点。 – jcollum 2012-07-31 22:59:51

让您的服务器上的文件的副本,并使用它。只有从服务器的一个加载失败

<script src="http://edge.quantserve.com/quant.js"></script> 
    <script>window.quant || document.write('<script src="js/quant.js"><\/script>')</script> 
+0

这是否仍然存在“等待超时”问题? – jcollum 2012-07-31 21:30:13

+0

权衡总是存在的。您也可以在Google服务器上托管该文件-code.google.com- – 2012-07-31 21:31:49

要获得关于不必等待脚本加载页面的其余部分之前加载,答案浏览器问题,它会加载您的副本通常不会。典型的浏览器将有多个线程处理页面和链接内容(CSS,图像,js)的下载。因此,应该加载页面的其余部分,尽管用户的浏览器指示器仍然会显示尝试加载的页面,直到最终请求达到或超时。

根据您尝试加载的资源的性质,这显然会以不同的方式影响您的页面。通常情况下,如果你担心这个问题,你可以将所有的文件放在一个普通的CDN上(或者如果你的网站没有那么高的流量),那么至少如果一件事失败了,很可能一切都会失败,更大的问题来与之抗衡:)

+0

页面加载不会被脚本阻止。如果页面顶部有'放在页面的最底部。 – 2012-07-31 21:36:10

+0

http://stackoverflow.com/a/1834129/30946 – jcollum 2012-07-31 21:42:49

+0

在IE中它支持10+,并且考虑到IE在性能方面是最大的违规者,所以尽可能将脚本移动到底部仍然不错: )一本关于整体HTML页面的好书perf:[NC Zakas:高性能JavaScript](http://shop.oreilly.com/product/9780596802806.do) – 2012-07-31 21:47:36