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 cannot be called by the external environment. 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()?
Suppose the system you maintain already references the jQuery library version 1.7.0, and you reference the jQuery library version 1.10.2 in the newly added functions. 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()
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>Latest Articles by Author
2024-10-22 09:46:29 2024-10-13 13:53:41 2024-10-12 12:15:51 2024-10-11 22:47:31 2024-10-11 19:36:51 2024-10-11 15:50:41 2024-10-11 15:07:41 2024-10-11 14:21:21 2024-10-11 12:59:11 2024-10-11 12:17:31Latest IssuesUnable to send form data on Safari/Firefox iOS This works on all platforms except Safari/Firefox on iOS: jQuery("#gform_1").one...From 2024-04-04 12:53:4801303