jQuery.noConflict()防冲突机制
许多JS库都非常喜欢使用$作为函数、变量。有时候,由于页面复杂的历史问题,或者为了实现特定的功能,我们不得不在页面中引入多个JS库。今儿个来学习学习jQuery库是怎么解决$冲突问题。(jQuery-1.7.1)
jQuery库全部使用自身的jQuery对象来完成内部实现。
在源码开头,有两行代码:
// Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$,
用来在调用jQuery.noConflict()函数时,检测全局环境中$ 和 jQuery变量是否被其它库覆盖。
在源码末尾,有一行代码:
// Expose jQuery to the global object window.jQuery = window.$ = jQuery;
用来定义全局的jQuery,$,引用自当前库的jQuery对象。
jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, //...... }
我们调用 jQuery.noConflict(),返回当前库未被覆盖的jQuery对象。
window.$ === jQuery,用来判断全局的$ 是否引用了当前jQuery对象
如果调用 jQuery.noConflict(true), 还会去检测全局的jQuery对象是否引用了当前的jQuery对象。
其实,我们也可以通过简单的修改上下文参数:
//自执行函数 (function($){ })(jQuery); //相当于jQuery(document).ready(function($){}); jQuery(function($){ });