Home  >  Article  >  Web Front-end  >  Three minutes to take you through jQuery.noConflict()_jquery

Three minutes to take you through jQuery.noConflict()_jquery

WBOY
WBOYOriginal
2016-05-16 15:15:431093browse

jQuery is one of the most widely used front-end frameworks, and a large number of third-party libraries and plug-ins are developed based on it. In order to avoid global namespace pollution, jQuery provides the jQuery.noConflict() method to resolve variable conflicts. This method is, without a doubt, very effective. Unfortunately, jQuery's official documentation does not describe this method clearly enough, and many developers do not know what exactly happens when they call jQuery.noConflict(), resulting in many problems when using it. Despite this, the implementation principle behind jQuery.noConflict() is still worth learning and mastering by web developers, and it can become a powerful tool to solve problems like global namespace pollution.

What is the role of jQuery.noConflict()?

jQuery.noConflict() exists for only one purpose: it allows you to load multiple jQuery instances on the same page, especially different versions of jQuery. You may be wondering, why do you need to load/use multiple different versions of jQuery objects on one page? Generally speaking, there are two situations. In the first case, your business code uses the latest version of the jQuery library, and the third-party plug-in you choose relies on an earlier version of the jQuery library; in the second case, you are maintaining a system that already has business For various reasons, the code references an older version of the jQuery library, and your newly developed module uses other versions of the jQuery library. In either case, you have to face the problem of jQuery object/method conflicts. Fortunately, jQuery.noConflict() helps you solve this trouble.

What happens when jQuery is loaded?

When jQuery is referenced/loaded by the page, it is encapsulated in a self-executing function (anonymous function). All variables, functions, and objects it provides are within the executable environment inside the anonymous function, and the external environment cannot Called to prevent global namespace pollution.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 

jQuery defines two global objects: jQuery and $ inside the anonymous function, exposing itself to the external environment. Various public methods used by developers are accessed through these two objects, such as jQuery.ajax(), jQuery.css(), etc. Initially, they point to the same object jQuery (private variables) inside the anonymous function, through which private variables and functions inside the anonymous function are accessed. This allows the internal private variables and functions of the anonymous function to still reside in the memory after it is executed, and will not be cleared by the JavaScript garbage collection mechanism.

window.jQuery = window.$ = jQuery; 

When jQuery is loaded by the page, the current page may already have the two global variables jQuery and $ (for example, other third-party libraries are loaded, and they are also defined internally), which will cause the Existing objects are overwritten (global namespace pollution). In order to solve this problem, jQuery internally caches the existing global variables and saves them in private variables _jQuery and _$ for subsequent calls. Therefore, if the jQuery and $ objects do not yet exist when the jQuery library is loaded on the page, then _jQuery and _$ are both undefined; otherwise, they will save references to the existing jQuery and $ (perhaps from the third-party library referenced before) Or a different version of the jQuery library). Afterwards, jQuery will overwrite these two global variables and expose itself to the external environment as described above. At this point, the global variables jQuery and $ on the page have pointed to the jQuery library just introduced.

// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,
// Otherwise expose jQuery to the global object as usual
window.jQuery = window.$ = jQuery; 

The magical effect of jQuery.noConflict()?

Assume that the system you maintain already references the 1.7.0 version of the jQuery library, and you reference the 1.10.2 version of the jQuery library in the newly added functionality. So, is there any way to reuse jQuery 1.7.0 or use both versions of the jQuery library at the same time? The answer is yes, that is jQuery.noConflict(). In fact, using jQuery.noConflict(), you can immediately redirect the global variables jQuery and $ to the previously referenced objects. Amazing, right? This is why jQuery internally caches previously referenced objects before exposing itself to the outside world.

jQuery.noConflict() accepts an optional Boolean parameter, usually the default value is false. What impact will this parameter have? Actually, it's very simple. If jQuery.noConflict() or jQuery.noConflict(false) is called, only the global variable $ will be reset to its previous reference value; if jQuery.noConflict() or jQuery.noConflict(true) is called, then the global variable $ will be reset to its previous reference value. Both jQuery and $ will be reset to their previous reference values. This is very important and is recommended to be kept in mind. When you call jQuery.noConflict(false/true), it will return the current jQuery instance. Using this feature, we can rename jQuery.

// "Renaming" jQuery
var jayquery = jQuery.noConflict( true );
// Now we can call things like jayquery.ajax(), jayquery.css(), and so on

Let’s look at another code snippet to test whether we really understand the magical noConflict()

<!-- jQuery and $ are undefined -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- jQuery and $ now point to jQuery 1.10.2 -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js">
<!-- jQuery and $ now point to jQuery 1.7.0 -->
<script>jQuery.noConflict();</script>
<!-- jQuery still points to jQuery 1.7.0; $ now points to jQuery 1.10.2 -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js">
<!-- jQuery and $ now point to jQuery 1.6.4 -->
<script>var jquery164 = jQuery.noConflict( true );</script>
<!-- jQuery now points to jQuery 1.7.0; $ now points to jQuery 1.10.2; jquery164 points to jQuery 1.6.4 --> 

避免第三方库的冲突

以上的代码片段展示了如何解决多版本jQuery的冲突。接下来,我们尝试解决jQuery库和第三方库的冲突,下面出现的代码片段在jQuery的官方文档中都有,有兴趣的程序猿可以仔细阅读官方文档体会其中的区别。

直接使用No-Conflict模式

使用No-Conflict模式,其实就是对jQuery进行重命名,再调用。

<!-- 采用no-conflict模式,jquery.js在prototype.js之后被引入. -->
<script src="prototype.js"></script>
<script src="jquery.js"></script>
<script>
var $j = jQuery.noConflict();
// $j 引用了jQuery对象本身.
$j(document).ready(function() {
$j( "div" ).hide();
});
// $ 被重新指向prototype.js里定义的对象
// document.getElementById(). mainDiv below is a DOM element, not a jQuery object.
window.onload = function() {
var mainDiv = $( "main" );
}
</script> 

使用自执行函数封装

使用这种方式,你可以在匿名函数内部继续使用标准的$对象,这也是众多jQuery插件采用的方法。需要注意的是,使用这种方法,函数内部无法再使用prototype.js定义的$对象了。

<!-- jquery.js在prototype.js之后被引入. -->
<script src="prototype.js"></script>
<script src="jquery.js"></script>
<script>
jQuery.noConflict();
(function( $ ) {
// Your jQuery code here, using the $
})( jQuery );
</script> 

使用标准jQuery(document).ready()函数

如果jQuery库在其它库之前引入,那么jQuery内部定义的jQuery和$会被第三方库覆盖,这时候再使用noConflict()已经没有什么意义了。解决的方法很简单,直接使用jQuery的标准调用方式。

<!-- jquery.js在prototype.js之前被引入. -->
<script src="jquery.js"></script>
<script src="prototype.js"></script>
<script>
// Use full jQuery function name to reference jQuery.
jQuery( document ).ready(function() {
jQuery( "div" ).hide();
});
// 或者
jQuery(function($){
// Your jQuery code here, using the $
});
// Use the $ variable as defined in prototype.js
window.onload = function() {
var mainDiv = $( "main" );
};
</script>

下面给大家介绍jQuery noConflict() 方法

noConflict() 方法会释放会 $ 标识符的控制,这样其他脚本就可以使用它了。

实例

当然,您仍然可以通过全名替代简写的方式来使用 jQuery:

$.noConflict();
jQuery(document).ready(function(){
jQuery("button").click(function(){
jQuery("p").text("jQuery 仍在运行!");
});
});

实例

您也可以创建自己的简写。noConflict() 可返回对 jQuery 的引用,您可以把它存入变量,以供稍后使用。请看这个例子:

var jq = $.noConflict();
jq(document).ready(function(){
jq("button").click(function(){
jq("p").text("jQuery 仍在运行!");
});
});

实例

如果你的 jQuery 代码块使用 $ 简写,并且您不愿意改变这个快捷方式,那么您可以把 $ 符号作为变量传递给 ready 方法。这样就可以在函数内使用 $ 符号了 - 而在函数外,依旧不得不使用 "jQuery":

$.noConflict();
jQuery(document).ready(function($){
$("button").click(function(){
$("p").text("jQuery 仍在运行!");
});
});
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn