jQuery で開発する場合、Prototype などの他の JS ライブラリを使用することもできますが、複数のライブラリが共存すると競合が発生する可能性があります。この記事では主に jQuery ライブラリの競合に対する完璧な解決策を紹介します。必要な方は参考にしてください。以下をご覧ください。
私の考えは、デザインを依頼された場合は、デフォルト値の $ を使用することです。パラメーターが渡されない場合は、$ を使用します。最後に、パラメーターを渡すときは、$ を使用します。たとえば、「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 間の競合を解決する方法
2. 他のライブラリの後に jQuery ライブラリをインポートします
jQuery noConflict() メソッドが制御を解放します。 $ identifier なので、他のスクリプトでもそれを使用できます。
1. jQuery の略語を正式名に置き換えることで使用できます
他のライブラリと jQuery ライブラリがロードされた後は、いつでも jQuery.noConflict() 関数を呼び出して、変数 $ の制御を他のライブラリに移すことができます。ライブラリ。その後、プログラム内で jQuery() 関数を 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. ショートカットをカスタマイズする
noConflict() は、jQuery への参照を返すことができ、後で使用するために、jq、$J 変数などのカスタム名で保存できます。
これにより、カスタマイズされたショートカットの使用中に 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>
3. 競合がない場合は引き続き $ を使用します
jQuery コード ブロックで $ 省略形を使用したいが、このショートカットを変更したくない場合は、$ 記号を変数として ready メソッドに渡すことができます。このように、関数内では $ 記号を使用できますが、関数の外では引き続き「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>
または、IEF ステートメント ブロックを使用します。これは、最小限のコード変更で完全な互換性を実現できるため、最も理想的な方法です。
私たちが独自の jquery プラグインを作成するときは、この記述方法を使用する必要があります。特定の作業プロセス中にさまざまな js ライブラリを順番に導入する方法がわからないためですが、このステートメント ブロックの記述方法は競合を防ぐことができます。
<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>
3. jQuery ライブラリは他のライブラリよりも先にインポートされます。
$ の所有権は、デフォルトでは次の JavaScript ライブラリに属します。その後、「jQuery」を直接使用して jQuery の作業を行うことができます。
同時に、$() メソッドを他のライブラリへのショートカットとして使用できます。ここで jQuery.noConflict() 関数を呼び出す必要はありません。
<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>
2. 原則
1. ソースコード
ソースコード: ソースコードでどのように行われるかを見てください
<!-- 引入 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>
jQuery がロードされると、現在の window.jQuery が _jQuery 変数を通じて取得されます事前に宣言し、_ $現在のウィンドウを取得します。$
jQuery.extend() を通じて noConflict を jQuery にマウントします。そのため、呼び出すときは常に jQuery.noConflict() をこのように調整します。
noConflict() を呼び出すときに 2 つの判断を行います
最初の if は $ の制御を渡します。
2 番目の if は、noConflict() がパラメーターを渡すときに jQuery の制御を渡します。
最後に、 noConflict() は jQuery オブジェクトを返します。そのオブジェクトを受け取るためにどのパラメーターが使用され、どのパラメーターが jQuery 制御を持ちますか。
2. 検証
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; } });
競合を解決する
//冲突 var $ = 123; //假设其他库中$为123 $( function () { console.log($); //报错Uncaught TypeError: $ is not a function } );
$コントロールを解放する例
//解决冲突 var jq = $.noConflict(); var $ = 123; jq(function () { alert($); //123 });
jQueryコントロールを解放する例
パラメータ deep: deep の役割は、jQuery の外部インターフェイスを放棄するために使用されます。
以下のように、noConflict()はパラメータを書き込まず、コンストラクタとしてjQueryをポップアップします。
<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>
パラメータ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(); jq(function () { alert(jQuery); //构造函数 }); </script>
関連する推奨事項:
jquery ライブラリと他のライブラリ間の競合の問題を解決するには jquery.noConflict() を使用する
jQuery ライブラリ他の JS ライブラリと競合します Solution_jquery
以上がjQueryライブラリの競合についてどうするかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。