JSはシングルスレッドで同期的に実行されることを理解しています。したがって、ブラウザのヘッドタグにファイルを追加すると、そのファイルが検出されるとすぐに実行されます。次に、次のスクリプトタグに移動し、そのファイルを実行します。私の質問は、jsファイルをHTMLヘッドタグに動的に追加するときです。ブラウザはそのファイルをどのように実行しますか?現在の実行がどこにあっても、ファイルがロードされるとすぐにファイルが実行されるようなものですか。それとも、そのファイルの実行方法を制御できるのでしょうか。
4 に答える
スクリプトがロードされると、できるだけ早く実行されます。つまり、クリックハンドラーなどの他の JavaScript 関数が実行されている場合、それが最初に終了することが許可されますが、ブラウザーでは通常、JavaScript は単一のスレッドで実行されるため、これは当然のことです。
スクリプトの読み込みのその部分を制御することはできませんが、JSONP に大きく影響された次のパターンを使用できます。
挿入されたスクリプト:
(function () {
var module = {
init: function () {
/* ... */
}
}
ready(module); // hook into "parent script"
}());
メインページのスクリプト:
function ready(o) {
// call init in loaded whenever you are ready for it...
setTimeout(function () { o.init(); }, 1000);
}
ここで重要なのは、ready
ページで定義され、動的に挿入するスクリプトから呼び出される関数です。スクリプトはすぐに動作を開始するのではなく、親ページに読み込まれたことを通知するだけで、親ページはinit
実行を開始したいときはいつでも、挿入されたスクリプト関数を呼び出すことができます。
JavaScript ファイルが動的にロードされるとどうなるか (非常に単純化され、チェックなし):
- ファイルがロードされます。
- 関数呼び出し eg
doSomething()
または(function(){...})()
がある場合、コードが実行されます (もちろん、定義が必要です)。 - 関数定義しかない場合は、関数呼び出しまで何も起こりません。
この例を参照してください: 3 つのファイルがロードされ、2 つがすぐに実行され、1 つがタイムアウトを待っています。
編集:
スクリプト タグは、ページのどこにでも配置できます。実際には、onload イベントを使用しない場合は、ページの最後に配置することをお勧めします ( yahoo スピード ヒント)。
これを行う方法を考えると、
var js=document.createElement('script')
js.setAttribute("type","text/javascript")
js.setAttribute("src", filename)
document.getElementsByTagName("head")[0].appendChild(js);
// ^ However this technique has been pointed to be not so trusworthy (Read the link in the comment by Pomeh)
しかし、あなたの質問に答える
ブラウザはそのファイルをどのように実行しますか?
スクリプトが DOM に追加されるとすぐに
現在の実行がどこにあるとしても、ファイルがロードされるとすぐにファイルが実行されるようなものですか?
はい
それとも、そのファイルの実行方法を制御できるということですか?
厄介なトリックではなく、onload イベント ハンドラーをアタッチする方が適切です。
質問に対する答えを得るために試すことができるコードを次に示します。
<script>
var s = document.createElement('script'), f = 1;
s.src="http://code.jquery.com/jquery-1.7.2.js";
document.head.appendChild(s)
s.onload = function(){
console.log(2);
f = 0
}
while(f){
console.log(1);
}
</script>
このコードは、スクリプトがロードされたときに 2 を出力するのが理想的ですが、気づいたら、それは決して起こりません </p>
注: これにより、ブラウザが強制終了されます。