7

我在用于初始化所有应用程序的脚本中有这段代码,它从谷歌 CDN 加载 jQuery 以及我们所有应用程序都需要的其他一些东西。然后,当我们加载特定的程序功能时,我们会检查以确保 jquery 已加载,以防 CDN 关闭。我遇到的问题是它仍在加载第二个。alert("Test");如果我在该行之后添加一个简单的,headTag.appendChild(jqTag);它可以完美地工作,但如果我删除警报,它会使用第二个。是什么赋予了?

它们是这样加载的:

<script type="text/javascript" src="i-initializer.js"></script>
<script type="text/javascript" src="i-program.js"></script>

初始化脚本:

if(typeof jQuery=='undefined'){
    var headTag = document.getElementsByTagName("head")[0];
    var jqTag = document.createElement('script');
    jqTag.type = 'text/javascript';
    jqTag.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js';
    headTag.appendChild(jqTag);
}

然后在另一个脚本中,我们有以下内容:

if(typeof jQuery=='undefined'){
    var header = document.getElementsByTagName("head")[0];
    var qtag = document.createElement('script');
    qtag.type = 'text/javascript';
    qtag.src = 'http://feedback.oursite.com/scripts/jquery-1.8.3.min.js';
    qtag.onload = checkjQueryUI;
    header.appendChild(qtag);
}
else
{
    jQCode();
}
jQCode() {
...
}
4

2 回答 2

17

这是HTML5 Boilerplate使用的技术。首先它加载 Google CDN 脚本,然后立即检查全局jQuery对象是否存在——如果不存在,CDN 失败,而是加载本地副本。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.8.3.min.js"><\/script>')</script>
于 2012-12-06T15:09:03.507 回答
3

您的后备代码异步加载 jQuery。
这意味着您的脚本的其余部分在 jQuery 加载之前运行。

添加alert()调用会强制其余代码等待(直到您单击确定);到那时,jQuery 将已加载。

相反,您可以发出一个新<script>标签,document.write()用于同步加载它。

或者,您可以将其余代码包装在回调中,并在 jQuery 加载后调用回调。
如果你这样做,你应该使用一个脚本加载器库,它将为你处理所有这些。

于 2012-12-06T15:10:26.767 回答