importjs() タイプの関数 (例については以下を参照) を使用する場合、jQuery はそれに続くコードの前にロードされていないようです。
サンプルの html ファイルを次に示します。
<html>
<head></head>
<body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
function importjs(jsFile) {
var body = document.getElementsByTagName('head').item(0);
var scpt = document.createElement('script');
scpt.src = jsFile;
scpt.type = 'text/javascript';
body.appendChild(scpt);
}
var f1="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js";
//importjs(f1);
var $j=jQuery;
alert("hello stackoverflow!");
</script>
</body>
</html>
上記のコードでは、アラートが正常に発生するはずです。
次に、最初のスクリプト ブロック、つまり jQuery を明示的にロードするスクリプト ブロックをコメント アウトし、2 番目のスクリプト ブロックの importjs(f1) 行のコメントを外します。今回は、少なくとも firefox と safari ではアラートは発生しません。
ここで、「var $j=jQuery」行の前に追加のアラートを挿入します。私にとっては、待ち時間に関係なく、両方のブラウザーで機能します。setTimeout もおそらくうまくいくでしょうが、このようなプログラムを作成する理想的な方法でもありません。
javascript がシングルスレッドの場合、importjs が失敗するのはなぜですか? importjs によって作成された新しい要素が最初のブロックが終了するまで「実行」されないためですか、それとも新しい要素が作成されるとすぐに実行されるべきですか?