我正在编写一个需要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)?如果是这样,有什么方法可以解决这个问题?谢谢!
答案 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 强>