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 仍在运行!"); }); });

Understanding how JavaScript engine works internally is important to developers because it helps write more efficient code and understand performance bottlenecks and optimization strategies. 1) The engine's workflow includes three stages: parsing, compiling and execution; 2) During the execution process, the engine will perform dynamic optimization, such as inline cache and hidden classes; 3) Best practices include avoiding global variables, optimizing loops, using const and lets, and avoiding excessive use of closures.

Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

Python and JavaScript have their own advantages and disadvantages in terms of community, libraries and resources. 1) The Python community is friendly and suitable for beginners, but the front-end development resources are not as rich as JavaScript. 2) Python is powerful in data science and machine learning libraries, while JavaScript is better in front-end development libraries and frameworks. 3) Both have rich learning resources, but Python is suitable for starting with official documents, while JavaScript is better with MDNWebDocs. The choice should be based on project needs and personal interests.

The shift from C/C to JavaScript requires adapting to dynamic typing, garbage collection and asynchronous programming. 1) C/C is a statically typed language that requires manual memory management, while JavaScript is dynamically typed and garbage collection is automatically processed. 2) C/C needs to be compiled into machine code, while JavaScript is an interpreted language. 3) JavaScript introduces concepts such as closures, prototype chains and Promise, which enhances flexibility and asynchronous programming capabilities.

Different JavaScript engines have different effects when parsing and executing JavaScript code, because the implementation principles and optimization strategies of each engine differ. 1. Lexical analysis: convert source code into lexical unit. 2. Grammar analysis: Generate an abstract syntax tree. 3. Optimization and compilation: Generate machine code through the JIT compiler. 4. Execute: Run the machine code. V8 engine optimizes through instant compilation and hidden class, SpiderMonkey uses a type inference system, resulting in different performance performance on the same code.

JavaScript's applications in the real world include server-side programming, mobile application development and Internet of Things control: 1. Server-side programming is realized through Node.js, suitable for high concurrent request processing. 2. Mobile application development is carried out through ReactNative and supports cross-platform deployment. 3. Used for IoT device control through Johnny-Five library, suitable for hardware interaction.

I built a functional multi-tenant SaaS application (an EdTech app) with your everyday tech tool and you can do the same. First, what’s a multi-tenant SaaS application? Multi-tenant SaaS applications let you serve multiple customers from a sing

This article demonstrates frontend integration with a backend secured by Permit, building a functional EdTech SaaS application using Next.js. The frontend fetches user permissions to control UI visibility and ensures API requests adhere to role-base


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Dreamweaver Mac version
Visual web development tools