>  기사  >  웹 프론트엔드  >  jQuery.noConplict()_jquery를 안내하는 데 3분이 소요됩니다.

jQuery.noConplict()_jquery를 안내하는 데 3분이 소요됩니다.

WBOY
WBOY원래의
2016-05-16 15:15:431093검색

jQuery는 가장 널리 사용되는 프런트엔드 프레임워크 중 하나이며 이를 기반으로 수많은 타사 라이브러리와 플러그인이 개발되었습니다. 전역 네임스페이스 오염을 방지하기 위해 jQuery는 변수 충돌을 해결하는 jQuery.noConflect() 메서드를 제공합니다. 이 방법은 의심할 여지 없이 매우 효과적이다. 불행하게도 jQuery의 공식 문서에는 이 방법이 충분히 명확하게 설명되어 있지 않으며, 많은 개발자가 jQuery.noConflect()를 호출할 때 정확히 어떤 일이 발생하는지 모르기 때문에 이를 사용할 때 많은 문제가 발생합니다. 그럼에도 불구하고 jQuery.noConstrict()의 구현 원리는 여전히 웹 개발자가 배우고 숙달할 가치가 있으며 전역 네임스페이스 오염과 같은 문제를 해결하는 강력한 도구가 될 수 있습니다.

jQuery.noContribute()의 역할은 무엇인가요?

jQuery.noConstrict()는 단 하나의 목적으로만 존재합니다. 즉, 동일한 페이지에 여러 jQuery 인스턴스, 특히 다양한 버전의 jQuery를 로드할 수 있도록 해줍니다. 한 페이지에 여러 다른 버전의 jQuery 객체를 로드/사용해야 하는 이유가 무엇인지 궁금할 것입니다. 일반적으로 두 가지 상황이 있습니다. 첫 번째 경우에는 비즈니스 코드가 최신 버전의 jQuery 라이브러리를 사용하고, 선택한 타사 플러그인은 이전 버전의 jQuery 라이브러리에 의존합니다. 두 번째 경우에는 이미 있는 시스템을 유지 관리하고 있습니다. 비즈니스 여러 가지 이유로 코드는 이전 버전의 jQuery 라이브러리를 참조하고 새로 개발된 모듈은 다른 버전의 jQuery 라이브러리를 사용합니다. 두 경우 모두 jQuery 개체/메서드 충돌 문제에 직면해야 합니다. 다행스럽게도 jQuery.noConstrict()는 이 문제를 해결하는 데 도움이 됩니다.

jQuery가 로드되면 어떻게 되나요?

jQuery가 페이지에서 참조/로드되면 자체 실행 함수(익명 함수)로 캡슐화됩니다. jQuery가 제공하는 모든 변수, 함수 및 개체는 익명 함수 내부의 실행 환경과 외부 환경 내에 있습니다. 전역 네임스페이스 오염을 방지하기 위해 호출할 수 없습니다.

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

jQuery는 익명 함수 내부에 jQuery와 $라는 두 개의 전역 개체를 정의하여 외부 환경에 자신을 노출합니다. 개발자가 사용하는 다양한 공개 메소드는 jQuery.ajax(), jQuery.css() 등과 같은 두 객체를 통해 액세스됩니다. 처음에는 익명 함수 내부의 동일한 개체 jQuery(개인 변수)를 가리키며 이를 통해 익명 함수 내부의 개인 변수와 함수에 액세스합니다. 이를 통해 익명 함수의 내부 전용 변수와 함수가 실행된 후에도 메모리에 계속 남아 있을 수 있으며 JavaScript 가비지 수집 메커니즘에 의해 지워지지 않습니다.

window.jQuery = window.$ = jQuery; 

페이지에서 jQuery를 로드할 때 현재 페이지에는 이미 두 개의 전역 변수인 jQuery와 $가 있을 수 있습니다(예를 들어 다른 타사 라이브러리가 로드되고 내부적으로 정의되기도 함). 덮어쓰게 됩니다(전역 네임스페이스 오염). 이 문제를 해결하기 위해 jQuery는 기존 전역 변수를 내부적으로 캐시하고 후속 호출을 위해 이를 개인 변수 _jQuery 및 _$에 저장합니다. 따라서 jQuery 라이브러리가 페이지에 로드될 때 jQuery 및 $ 개체가 아직 존재하지 않으면 _jQuery 및 _$는 모두 정의되지 않습니다. 그렇지 않으면 기존 jQuery 및 $에 대한 참조를 저장합니다(아마도 타사에서 가져온 것임). 이전에 참조된 라이브러리) 또는 다른 버전의 jQuery 라이브러리). 이후에 jQuery는 이 두 전역 변수를 덮어쓰고 위에서 설명한 대로 외부 환경에 노출됩니다. 이 시점에서 페이지의 전역 변수 jQuery 및 $는 방금 소개한 jQuery 라이브러리를 가리켰습니다.

// 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; 

jQuery.noContribute()의 마법같은 효과?

귀하가 유지 관리하는 시스템이 이미 jQuery 라이브러리 1.7.0 버전을 참조하고 새로 추가된 기능에서 jQuery 라이브러리 1.10.2 버전을 참조한다고 가정합니다. 그렇다면 jQuery 1.7.0을 재사용하거나 두 버전의 jQuery 라이브러리를 동시에 사용할 수 있는 방법이 있습니까? 대답은 '예'입니다. 즉, jQuery.noConflect()입니다. 실제로 jQuery.noConflect()를 사용하면 전역 변수 jQuery 및 $를 이전에 참조된 객체로 즉시 리디렉션할 수 있습니다. 놀랍지 않나요? 이것이 jQuery가 외부 세계에 노출되기 전에 이전에 참조된 객체를 내부적으로 캐시하는 이유입니다.

jQuery.noConstrict()는 선택적 부울 매개변수를 허용하며 일반적으로 기본값은 false입니다. 이 매개변수는 어떤 영향을 미치나요? 실제로는 매우 간단합니다. jQuery.noConflect() 또는 jQuery.noConflect(false)가 호출되면 전역 변수 $만 이전 참조 값으로 재설정됩니다. $는 이전 참조 값으로 재설정됩니다. jQuery와 $는 모두 이전 참조 값으로 재설정됩니다. 이는 매우 중요하므로 명심하는 것이 좋습니다. jQuery.noConflect(false/true)를 호출하면 현재 jQuery 인스턴스가 반환됩니다. 이 기능을 사용하면 jQuery의 이름을 바꿀 수 있습니다.

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

우리가 마법의 noContribute()를 실제로 이해하고 있는지 테스트하기 위해 또 다른 코드 조각을 살펴보겠습니다.

<!-- 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 仍在运行!");
});
});
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.