4

wordpress や magento など、さまざまな種類の Web サイトで実行できる JavaScript ライブラリがあります。js ライブラリは jQuery を動的にロードし、noConflict を呼び出して、スクリプト要素の onereadystatechange() で別の変数名前空間に割り当てます。ただし、サイトが js lib の前に Prototype js もロードする場合、Prototype と jQuery の間で競合が発生する可能性があります。

onereadystatechange コールバックが呼び出される前に、ページが解析され、Prototype 関数が呼び出される場合があります。その Prototype 関数が「$」を使用する場合、そのドル記号「$」はまだ (jQuery.noConflict() が呼び出される前に) Prototype ではなく jQuery であるため、その関数は失敗します。

「$」をまったく使用しないようにカスタム jQuery を作成して、上記の理由で Prototype を再度ロードする必要がないようにできますか?

編集1:

私の js ライブラリ (mylib.js) が Web サイトで使用されるプロセスと、jQuery がその Web サイトの Prototype とどのように競合するかを次に示します。

他人のウェブサイトからのonepage.html

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

mylib.js

1. If jQuery is not defined, create a script element with jQuery src and insert to header.
2. In the script element, attach event onreadystatechange.
  element.attachEvent('onreadystatechange', function () {
  if (elem.readyState == 'loaded' || elem.readyState == 'complete') {
      callback();
    }
  });
3. in callback(), I called noConflict().
   var callback = function() {
     return function() {
        if (window['jQuery'] && hasJQueryReqVersion()) {
           window.myJQ = jQuery.noConflict(true);
        }
     }
   }();

問題は callback() が呼び出される前です。Prototype が呼び出され、jQuery によってオーバーライドされた '$' が誤って使用される可能性があります。

4

2 に答える 2

3

ライブラリがロードされる順序を制御できます。最初にjQueryライブラリをロードします(そのスクリプトノードをに設定し、他のスクリプトをロードできるように<head>する前に、すぐにを呼び出します。$.noConflict()

于 2012-11-26T21:40:40.857 に答える
2

最初に jQuery をロードし、$.noConflict()すぐに呼び出します。

jQuery を設定して、次の$ような使用を完全に回避することもできます

var JQry = jQuery.noConflict();
于 2012-11-26T21:42:13.837 に答える