#include
短いバージョン: 「 JavaScript でステートメントをどのように合成しますか?」
長いバージョン:
一般的な Web ページに追加できるようにしたい JavaScript コード ファイルがあります。これらのページには、ファイルを読み込むために <script> タグを含める必要があるということ以外に、特定の条件を課す必要はありません。
私のファイルには jQuery に依存するコードが含まれているため、ファイルから jQuery をロードする必要があります。<script> タグを DOM に挿入することでこれを行っています。問題は、jQuery が読み込まれるとすぐにコードを実行する必要があることです。これにより、ページに古いバージョンの jQuery が既に読み込まれている場合に、新しく読み込まれたバージョンによって上書きされないようにすることができます (つまり、への参照を取得してから$
呼び出していますjQuery.noConflict(true);
)。
これを実現するために、動的に挿入される <script> 要素に onload/onreadystatechange ハンドラーを追加しています。これは基本的には機能しますが、問題は、基になるページに準備ができているページで待機しているものがある場合 (つまり$.ready(...)
)、このコードが <script> 要素自体のハンドラーの前に実行されるため、そのコードが my で実行されると問題が発生することです。新しくロードされた jQuery バージョンであり、ページがロードされ、コードが予期している元のバージョンではありません。
var script = document.createElement("script");
script.src = "//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js";
script.type = "text/javascript";
script.onload = script.onreadystatechange = function() {
if (this.readyState && this.readyState != "loaded" &&
this.readyState != "complete")
return;
var $ = jQuery;
jQuery.noConflict(true);
do_my_stuff($);
}
document.getElementsByTagName("body")[0].appendChild(script);
私のコードが呼び出されている Web ページを制御できないことに注意してください。そのため、「ページに適切なバージョンの jQuery をロードさせる」ことは解決策ではありません。また、jQuery をコード ファイルに単純にインライン化することは、jQuery がかなり大きいため、優れたソリューションではありません (必要な機能だけを使用して再構築しても、ファイルはかなり大きくなります)。