3

JSはシングルスレッドで同期的に実行されることを理解しています。したがって、ブラウザのヘッドタグにファイルを追加すると、そのファイルが検出されるとすぐに実行されます。次に、次のスクリプトタグに移動し、そのファイルを実行します。私の質問は、jsファイルをHTMLヘッドタグに動的に追加するときです。ブラウザはそのファイルをどのように実行しますか?現在の実行がどこにあっても、ファイルがロードされるとすぐにファイルが実行されるようなものですか。それとも、そのファイルの実行方法を制御できるのでしょうか。

4

4 に答える 4

3

スクリプトがロードされると、できるだけ早く実行されます。つまり、クリックハンドラーなどの他の 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実行を開始したいときはいつでも、挿入されたスクリプト関数を呼び出すことができます。

于 2012-04-22T12:22:23.290 に答える
3

JavaScript ファイルが動的にロードされるとどうなるか (非常に単純化され、チェックなし):

  1. ファイルがロードされます。
  2. 関数呼び出し egdoSomething()または(function(){...})()がある場合、コードが実行されます (もちろん、定義が必要です)。
  3. 関数定義しかない場合は、関数呼び出しまで何も起こりません。

このを参照してください: 3 つのファイルがロードされ、2 つがすぐに実行され、1 つがタイムアウトを待っています。

編集:

スクリプト タグは、ページのどこにでも配置できます。実際には、onload イベントを使用しない場合は、ページの最後に配置することをお勧めします ( yahoo スピード ヒント)。

HTML5 JavaScript には Web ワーカーMDN MSDN wikipediaがあります。

于 2012-04-22T13:34:24.270 に答える
1

これを行う方法を考えると、

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 イベント ハンドラーをアタッチする方が適切です。

于 2012-04-22T12:19:36.207 に答える
-3

質問に対する答えを得るために試すことができるコードを次に示します。

<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>

注: これにより、ブラウザが強制終了されます。

于 2012-04-22T12:16:08.097 に答える