我不了解noConflict函数的源代码。它在 jQuery 3.3.1 中:
jQuery.noConflict = function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
}
if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
}
return jQuery;
};
为什么他们检查window.jQuery和jQuery之间的严格相等性? (deep && window.jQuery === jQuery)
window.jQuery
除了jQuery之外还可以包含什么?
window.jQuery
可以等于jQuery,我想可以是未定义的,但是没有别的。我认为其他库不会将jQuery放在窗口对象上。
然后,从“ Professional jQuery”(本书)中获得以下代码:
noConflict: function( deep ) {
window.$ = _$;
if ( deep ) {
window.jQuery = _jQuery;
}
return jQuery;
}
不使用window.jQuery === jQuery.
答案 0 :(得分:0)
这是在加载多个版本的jQuery的情况下。让我们在这里做一个样本
function PseudoJQuery(version) {
//keep track of version
this.version = version;
//keep previous $ and jQuery values
var _$ = window.$;
var _jQuery = window.jQuery;
//assign the current version
var jQuery = this;
window.$ = jQuery;
window.jQuery = jQuery;
//re-use the jQuery.noConflict
this.noConflict = function(deep) {
if (window.$ === jQuery) {
window.$ = _$;
}
//remove the check
if (deep /*&& window.jQuery === jQuery */) {
window.jQuery = _jQuery;
}
return jQuery;
};
}
//load multiple versions of our jQuery
var j2 = new PseudoJQuery(2);
var j3 = new PseudoJQuery(3);
console.log("version after loading", window.jQuery.version);
j2.noConflict(true);
console.log("version after noConflict", window.jQuery.version); //error
因此,这是jQuery初始化时的简化版本以及调用noConflict
时尝试还原的简化版本。 之所以失败,是因为当我们调用j2.noConflict
时,window.jQuery
变量将返回其初始状态-undefined
,从而破坏了版本3的安装。
检查到位后,jQuery的 current 版本将仅在调用noConflict
时销毁,而在其他jQuery安装中不会销毁。
function PseudoJQuery(version) {
//keep track of version
this.version = version;
//keep previous $ and jQuery values
var _$ = window.$;
var _jQuery = window.jQuery;
//assign the current version
var jQuery = this;
window.$ = jQuery;
window.jQuery = jQuery;
//re-use the jQuery.noConflict
this.noConflict = function(deep) {
if (window.$ === jQuery) {
window.$ = _$;
}
if (deep && window.jQuery === jQuery) {
window.jQuery = _jQuery;
}
return jQuery;
};
}
//load multiple versions of our jQuery
var j2 = new PseudoJQuery(2);
var j3 = new PseudoJQuery(3);
console.log("version after loading", window.jQuery.version);
j2.noConflict(true);
console.log("version after noConflict", window.jQuery.version);