在加载DOM后如何运行jQuery的后备副本?

以下是我的文档中关闭body标记正上方的标记中的第一行代码(它指定在Google的CDN失败的情况下运行本地提供的jQuery副本):

 if(!window.jQuery){ var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '/js/jquery.js'; var scriptHook = document.getElementsByTagName('script')[0]; scriptHook.parentNode.insertBefore(script, scriptHook); } jQuery(document).ready(function($){ // page behaviors }); 

它确实成功执行,因为如果我的计算机没有连接到Internet(这是本地提供的页面),则会插入jQuery的本地副本。 但是,下面的document.ready()部分不会执行。 我猜这是因为它是在jQuery的后备副本生效之前调用的。 什么是以某种方式“延迟”执行的正确做法,以便jQuery的任何副本都能正常工作?

在调用jQuery之前,您需要确保要附加到dom的脚本已完成加载。 您可以使用此处描述的技术执行此操作:

 if(!window.jQuery){ var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '/js/jquery.js'; script.onreadystatechange= function () { if (this.readyState == 'complete') jQueryLoaded(); } script.onload = jQueryLoaded; var scriptHook = document.getElementsByTagName('script')[0]; scriptHook.parentNode.insertBefore(script, scriptHook); } function jQueryLoaded() { }; 

您还可以将AjQuery内容作为Ajax请求获取,创建一个脚本标记,将其作为脚本的主体并附加它。 那也行。

考虑使用现有的脚本加载器,例如yepnope 。 有一个例子,你正在尝试在主页上做什么。

试试吧

   

这样脚本标记将同步加载。

“我如何应对我的CDN失败并加载托管在我的服务器上的文件”的问题似乎最近出现了几次。

问题我要问的是,是否添加更多js是实现弹性的方法,以及js接近真正增加的弹性水平,例如,如果CDN出现故障,它们将是一个快速失败,但如果CDN对这些解决方案的应对程度反应迟钝?

解决这个问题的另一种方法是将其视为基础设施问题……

根据您拥有的域/子域运行CDN。 自动监控其可用性,当它失败时将DNS切换到备份服务器(任播还可以提供替代解决方案)

一个PHP解决方案将是这样的:

 $google_jquery = 'https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js'; $fp = @fsockopen($google_jquery, 'r'); if (!$fp) { echo ''; } else { echo '' } }