将jQuery脚本简化如下,可能看得更清楚jQuery的实现:先将(通过window全局变量来获取)外部$
、jQuery
对象缓存起来。
然后调用noConflict方法来恢复jquery.js加载之前的$、jQuery对象值。
// 请务必注意执行顺序
(function(window, undefined){
var jQuery = function(){
//...
},
_$ = window.$, // _$指向外部$
_jQuery = window.jQuery; // _jQuery指向外部jQuery
//...
jQuery.extend({
noConflict: function(deep){
if(window.$ === jQuery) { window.$ = _$; }
if(deep && window.jQuery === jQuery) { window.jQuery = _jQuery; }
}
});
//...
// 用本地jQuery覆盖外部jQuery、$(其初衷当然不是“覆盖”,只是保证在外部可以直接使用jQuery、$)
winodw.jQuery = window.$ = jQuery;
})(window);
默认情况下,同样的使用jQuery
、$
等相同关键字的脚本框架,后导入框架的总是控制优先权。
在以下两个场景,以jQuery为核心,如何正常地使用jQuery与其它框架:
- jQuery在前时,$关键字被其它框架覆盖。要想使用jQuery,只能使用jQuery关键字。
其它框架不太可能使用jQuery关键字。
<script src="jquery.js" type="text/javascript" />
<script src="xxx.js" type="text/javascript" />
<script type="text/javascript">
// jQuery关键字$被框架的xxx.js中的$被覆盖
</script>
- jQuery在后时,jQuery取得优先权。但是如何使用xxx.js中的$关键字呢?
<script src="xxx.js" type="text/javascript" />
<script src="jquery.js" type="text/javascript" />
<script type="text/javascript">
// 问题1. xxx.js的$关键字,被jQuery.js覆盖,怎么办?
// jQuery仍然用jQuery关键字,xxx.js使用$的做法如下
jQuery.noConflict();
</script>
如果jquery.js在后,覆盖了其它的框架使用$、jQuery关键字,即jquery.js不能再使用这两个关键字,怎么解决了?当然是取别名了。
//注意指定参数true,才会将jQuery关键字转让出去。
var jq = jQuery.noConflict(true);