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 によってオーバーライドされた '$' が誤って使用される可能性があります。