jQuery.noConflict()在异步加载jQuery时

时间:2014-07-15 23:50:30

标签: javascript jquery asynchronous callback

我正在编写一个需要jQuery 1.7或更高版本的Javascript库。但是,我的图书馆用户可能会在他们的网站上加载他们自己的jQuery版本,我们无法控制。现在,我正在使用我的库中的回调异步加载jQuery,并使用jQuery的noConflict(true)方法来处理版本冲突。

到目前为止,我还没有遇到任何问题,但是与异步行为和并发性相关的问题是随机的,很难测试。我对Javascript中的异步函数的细节不是很熟悉,所以我想要一个解释。我们说我有以下代码:

用户网站上的代码:

// loading javascript library
<script type="text/javascript" src="library.js">

// loading jQuery version lower than 1.7.0
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js">

库中用于异步加载jQuery的代码:

// set jQuery and $ to $j using noConflict()
loadScript("//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js", function() {
          $j = jQuery.noConflict(true);
      });

function loadScript(url, callback){
    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;

    script.onreadystatechange = callback;
    script.onload = callback;

    head.appendChild(script);
}

据我了解,用户的页面将首先加载我的库代码,该代码将开始异步加载jQuery 1.11.1并使用jQuery.noConflict(true)重命名jQuery和$ global变量。然后该页面将继续在原始页面上加载jQuery 1.2.3。所以jQuery和$应该引用1.2.3,而$ j将引用1.11.1。

但是,由于jQuery中的异步加载或浏览器中的多线程,是否有可能$ j指向1.2.3而不是1.11.1?例如,加载jQuery 1.2.3的行是否可以在$j = jQuery.noConflict(true)之前执行,因此$ j现在指向jQuery 1.2.3(当前版本的jQuery)?如果是这样,有什么方法可以解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:0)

在这种情况下,我认为您最好使用document.write,并确保告知用户将您的代码放在首位。

我说appendChild的原因会将您的标记放在可能位于头部的任何其他脚本的末尾,这可能是jQuery。

我还建议提出一个比$j更独特的变量,这在noConflict情况下并不罕见。

另外,我会检查jQuery是否已经存在,并且是一个与您的代码兼容的版本,然后再添加它。 您可以使用jQuery.fn.jquery检查版本。如果它已经存在,您可以将其克隆到noConflict变量。

这是一篇有很多好读物的帖子:

<强> Best way to use Google's hosted jQuery, but fall back to my hosted library on Google fail