jQuery 라이브러리 충돌에 대해 수행할 작업

小云云
풀어 주다: 2018-01-11 14:08:40
원래의
1453명이 탐색했습니다.

jQuery로 개발할 때 Prototype 등 다른 JS 라이브러리를 사용해도 되지만 여러 라이브러리가 공존할 경우 충돌이 발생할 수 있습니다. 이 글에서는 jQuery 라이브러리 충돌에 대한 완벽한 솔루션을 주로 소개합니다. 아래를 살펴보세요.

디자인을 요청하면 기본값인 $를 사용하고, 매개변수가 전달되지 않으면 $를 사용합니다. 마지막으로 매개변수를 전달할 때는 $를 사용합니다. 예를 들어 Enter jq를 입력하면 window.jq에 마운트됩니다.

var myControl="jq";
(function(name){
 var $=name ||"$"; //name存在$的值就是name的值,不存在或为null,$的值为字符串"$"
 console.log($);
 window[$]=function(){
 alert("123");
 }
})(myControl)
window[myControl]();
로그인 후 복사

사실 이것은 충돌을 해결하는 jquery의 방식이 아닙니다. 그런 다음 jQuery가 충돌을 해결하는 방법을 살펴보세요.

jQuery의 여러 버전이나 다른 js 라이브러리와의 충돌은 주로 일반적으로 사용되는 $ 기호와 충돌합니다.

1. 충돌 해결

1. 동일한 페이지에서 여러 버전의 jQuery 간의 충돌을 해결하는 방법

<body>
<!-- 引入1.6.4版的jq -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script>
<script> var jq164 = jQuery.noConflict(true); </script>
<!-- 引入1.4.2版的jq -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script>
<script> var jq142 = jQuery.noConflict(true); </script>

<script>
(function($){
 //此时的$是jQuery-1.6.4
 $('#');
})(jq164);
</script>
 
<script>
jq142(function($){
 //此时的$是jQuery-1.4.2
 $('#');
});
</script>
 
</body>
로그인 후 복사

2. 다른 라이브러리 다음에 jQuery 라이브러리를 가져옵니다. $ 식별자이므로 다른 스크립트에서 사용할 수 있습니다.

1. 약어를 전체 이름으로 바꿔서 jQuery를 사용할 수 있습니다.

다른 라이브러리와 jQuery 라이브러리가 로드된 후 언제든지 jQuery.noConflect() 함수를 호출하여 변수 $의 제어를 다른 라이브러리로 전달할 수 있습니다. 라이브러리. 그런 다음 jQuery() 함수를 프로그램의 jQuery 개체에 대한 제조 공장으로 사용할 수 있습니다.

<script src="prototype.js" type="text/javascript"></script>
<script src="jquery.js" type="text/javascript"></script>

<p id="pp">test---prototype</p>
<p>test---jQuery</p>

<script type="text/javascript">
jQuery.noConflict();  //将变量$的控制权让渡给prototype.js,全名可以不调用。
jQuery(function(){   //使用jQuery
 jQuery("p").click(function(){
 alert( jQuery(this).text() );
 });
});
//此处不可以再写成$,此时的$代表prototype.js中定义的$符号。

$("pp").style.display = 'none'; //使用prototype
</script>
로그인 후 복사
2. 바로가기 사용자 정의

noConstrict()는 나중에 사용하기 위해 jq, $J 변수와 같은 사용자 정의 이름에 저장할 수 있는 jQuery에 대한 참조를 반환할 수 있습니다.

이렇게 하면 사용자 정의된 단축키를 사용하는 동안 jQuery가 다른 라이브러리와 충돌하지 않게 됩니다.

<script type="text/javascript">
var $j = jQuery.noConflict(); //自定义一个比较短快捷方式
$j(function(){   //使用jQuery
 $j("p").click(function(){
 alert( $j(this).text() );
 });
});

$("pp").style.display = 'none'; //使用prototype
</script>
로그인 후 복사
3. 충돌이 없으면 계속 $를 사용하세요

jQuery 코드 블록에서 $ 약어를 사용하고 이 단축키를 변경하고 싶지 않은 경우 $ 기호를 Ready 메소드에 변수로 전달할 수 있습니다. 이런 식으로 함수 내부에서는 $ 기호를 사용할 수 있지만 함수 외부에서는 여전히 "jQuery"를 사용해야 합니다.

<script type="text/javascript">
jQuery.noConflict(); //将变量$的控制权让渡给prototype.js
jQuery(document).ready(function($){
 $("p").click(function(){ //继续使用 $ 方法
 alert( $(this).text() );
 });
});
//或者如下
jQuery(function($){   //使用jQuery
 $("p").click(function(){ //继续使用 $ 方法
 alert( $(this).text() );
 });
});
</script>
로그인 후 복사
또는 최소한의 코드 변경으로 완전한 호환성을 달성할 수 있기 때문에 가장 이상적인 방법이 될 IEF 문 블록을 사용하세요.

자체 jquery 플러그인을 작성할 때 우리는 특정 작업 프로세스 중에 다양한 js 라이브러리를 순차적으로 도입하는 방법을 모르기 때문에 모두 이 작성 방법을 사용해야 하지만 이 명령문 블록 작성 방법은 충돌을 막을 수 있습니다.

<script type="text/javascript">
jQuery.noConflict();  //将变量$的控制权让渡给prototype.js
(function($){   //定义匿名函数并设置形参为$
 $(function(){   //匿名函数内部的$均为jQuery
 $("p").click(function(){ //继续使用 $ 方法
  alert($(this).text());
 });
 });
})(jQuery);    //执行匿名函数且传递实参jQuery

$("pp").style.display = 'none'; //使用prototype
</script>
로그인 후 복사
3. jQuery 라이브러리는 다른 라이브러리보다 먼저 가져옵니다.

jQuery 라이브러리는 기본적으로 $의 소유권에 속합니다. 그런 다음 "jQuery"를 직접 사용하여 일부 jQuery 작업을 수행할 수 있습니다.

동시에 $() 메서드를 다른 라이브러리에 대한 바로가기로 사용할 수 있습니다. 여기서는 jQuery.noConflect() 함수를 호출할 필요가 없습니다.

<!-- 引入 jQuery -->
<script src="../../scripts/jquery.js" type="text/javascript"></script>
<!-- 引入 prototype -->
<script src="lib/prototype.js" type="text/javascript"></script>

<body>
<p id="pp">Test-prototype(将被隐藏)</p>
<p >Test-jQuery(将被绑定单击事件)</p>

<script type="text/javascript">
jQuery(function(){ //直接使用 jQuery ,没有必要调用"jQuery.noConflict()"函数。
 jQuery("p").click(function(){  
  alert( jQuery(this).text() );
 });
});

$("pp").style.display = 'none'; //使用prototype
</script>
</body>
로그인 후 복사
2. 원리

1. 소스 코드

소스 코드: 소스 코드에서 어떻게 이루어지는지 살펴보세요

var
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,

// Map over the $ in case of overwrite
_$ = window.$,

jQuery.extend({
 noConflict: function( deep ) {
   if ( window.$ === jQuery ) {
    window.$ = _$;
   }

   if ( deep && window.jQuery === jQuery ) {
    window.jQuery = _jQuery;
   }

   return jQuery;
  }
});
로그인 후 복사
jQuery가 로드되면 _jQuery 변수를 통해 현재 window.jQuery를 가져옵니다. 미리 선언하고 _ $현재 창을 가져옵니다.$.

jQuery.extend()를 통해 jQuery에 noConstrict를 마운트합니다. 그래서 우리는 호출할 때 항상 jQuery.noConflect()를 이와 같이 조정합니다.

noConstrict()를 호출할 때 두 가지 판단을 내렸습니다.

첫 번째 if는 $의 제어권을 넘겨줍니다.

두 번째 if는 noContribute()가 매개변수를 전달할 때 jQuery의 제어권을 넘겨줍니다.

마지막으로 noConstrict()는 jQuery 개체를 반환하며, 이를 수신하는 데 사용되는 매개 변수와 jQuery 제어 기능을 갖게 될 매개 변수를 반환합니다.

2. 확인

//冲突 
 var $ = 123; //假设其他库中$为123
 $(
   function () {
    console.log($); //报错Uncaught TypeError: $ is not a function
   }
 );
로그인 후 복사

충돌 해결

//解决冲突
 var jq = $.noConflict();
 var $ = 123;
 jq(function () {
  alert($); //123
 });
로그인 후 복사
$ 컨트롤 해제 예

<script>
 var $ = 123; // window.$是123,存储在私有的_$上。

</script>
<script src="https://code.jquery.com/jquery-2.2.4.js"></script>
<body>
<p>aaa</p>
<script>
 var jq = $.noConflict();//当window.$===jQuery的时候,把_$赋给了window.$。
 jq(function () {
  alert($); //123
 });
</script>
로그인 후 복사
jQuery 컨트롤 해제 예

매개변수 deep의 역할: deep은 jQuery의 외부 인터페이스를 포기하는 데 사용됩니다.

다음과 같이 noConstrict()는 매개변수를 쓰지 않고 jQuery를 생성자로 팝업합니다.

<script>
 var $ = 123;
 var jQuery=456;
</script>
<script src="https://code.jquery.com/jquery-2.0.3.js"></script>
<body>
<p>aaa</p>
<script>
 var jq = $.noConflict();
 jq(function () {
  alert(jQuery); //构造函数
 });
</script>
로그인 후 복사

매개변수를 true로 쓰면 456이 뜹니다.

<script>
 var $ = 123;
 var jQuery=456;
</script>
<script src="https://code.jquery.com/jquery-2.0.3.js"></script>
<body>
<p>aaa</p>
<script>
 var jq = $.noConflict(true); //写了true或者参数的时候,deep为真window.jQuery===jQuery为真,所以进入if条件。把456赋值给window.jQuery
 jq(function () {
  alert(jQuery); //456
 });
</script>
로그인 후 복사
관련 권장 사항:

jquery.noConstrict()를 사용하여 jquery 라이브러리와 다른 라이브러리 간의 충돌 문제 해결

js/jQuery 라이브러리 작성 방법(경험 요약)

jQuery 라이브러리 다른 JS 라이브러리와 충돌합니다 Solution_jquery

위 내용은 jQuery 라이브러리 충돌에 대해 수행할 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿