我的网站应该如何妥善处理缺少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;
。也许这就是诀窍。
通常,它很难做到这一点,并跨浏览器。
一些建议:
- 移动脚本的HTML页面(这样你要求脚本之前,几乎一切都显示)
- 它移到底部的最底部,在
<script>document.write("<scr"+"ipt src='http://example.org/script.js'></scr"+"ipt>")</script>
把它包或者您在更新后添加的方式(document.createElement('script')
) - 最后一个选项是通过XHR加载它(但只有在CORS在第三方服务器上启用时,它才适用于同域或跨域);然后您可以使用XHR的
timeout
属性(用于IE和Fx12 +),并在其他浏览器中使用setTimeout
并检查XHR的readyState
。目前这是一种令人费解且非常不跨浏览器的方式,所以选项2看起来最好。
我认为你是对的。在查看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>
这是否仍然存在“等待超时”问题? – jcollum 2012-07-31 21:30:13
权衡总是存在的。您也可以在Google服务器上托管该文件-code.google.com- – 2012-07-31 21:31:49
要获得关于不必等待脚本加载页面的其余部分之前加载,答案浏览器问题,它会加载您的副本通常不会。典型的浏览器将有多个线程处理页面和链接内容(CSS,图像,js)的下载。因此,应该加载页面的其余部分,尽管用户的浏览器指示器仍然会显示尝试加载的页面,直到最终请求达到或超时。
根据您尝试加载的资源的性质,这显然会以不同的方式影响您的页面。通常情况下,如果你担心这个问题,你可以将所有的文件放在一个普通的CDN上(或者如果你的网站没有那么高的流量),那么至少如果一件事失败了,很可能一切都会失败,更大的问题来与之抗衡:)
页面加载不会被脚本阻止。如果页面顶部有'放在页面的最底部。 – 2012-07-31 21:36:10
http://stackoverflow.com/a/1834129/30946 – jcollum 2012-07-31 21:42:49
在IE中它支持10+,并且考虑到IE在性能方面是最大的违规者,所以尽可能将脚本移动到底部仍然不错: )一本关于整体HTML页面的好书perf:[NC Zakas:高性能JavaScript](http://shop.oreilly.com/product/9780596802806.do) – 2012-07-31 21:47:36
对于像分析这样的东西,确实没有问题。对于其他应用程序级别的脚本,您可能需要提醒用户该问题,或者自动刷新页面。 (Gmail会这样做。) – Brad 2012-07-31 21:24:24
难道你不能回退到本地副本吗? Ex(使用jQuery):'' – j08691 2012-07-31 21:26:39
您是否主要关心外部请求超时之前的漫长等待时间?第一个答案和以上评论解决了另一个问题。 – 2012-07-31 21:29:27