1
   <script>
      document.write("before write h1.js"+"<br/>");
      document.write("<script  src='h" + "1.js'><\/script>");
      document.write("after write h1.js" +"<br/>");
   </script>

h1.jsファイル:

これはh1.jsです


IEでは、結果は次のようになります。

  1. h1.jsを書く前に
  2. h1.jsを書き込んだ後
  3. これはh1.jsです

Firefox Chrome Safari Opera:

  1. h1.jsを書く前に
  2. これはh1.jsです
  3. h1.jsを書き込んだ後

すべてのブラウザで同じ順序になるようにスクリプトを作成するにはどうすればよいですか。

4

3 に答える 3

1

これは、すべてのブラウザで同じように機能するはずです。

<script>
    document.write('before h1.js');
</script>
<script src="h1.js"></script>
<script>
    document.write('after h1.js');
</script>
于 2012-05-14T09:54:30.217 に答える
0

Steve Soudersによるこのブログ投稿をチェックして、スクリプトを非同期にロードし、順序を確認する手法の問題を理解してください。

同じ参照から

document.writeスクリプトタグ–document.writeを使用してHTMLをページに書き込みます。これは、IEでブロックせずにスクリプトをロードするだけです。

そして、これが、このようにさまざまな実行順序を確認できる理由です。スクリプトのロードは実行をブロックしませんでしafter write h1.jsた。IEでのみ発生します

于 2012-05-14T11:40:46.703 に答える
0

次のように考えてください。IEはスクリプトを実行し、新しいコンテンツをに追加してからdocument、コンテンツを調べます。

したがって、h1.jsスクリプトがドキュメントに書き込む場合、このコードはJavaScriptの終了後に実行されます。これは、JavaScriptの同期性によるものです。

これを避けたい場合、通常の解決策はh1.js、適切なタイミングで呼び出すことができる関数を定義することです。次に、次のように書くことができます。

<script>document.write("<script  src='h" + "1.js'><\/script>");</script>
<script>
    document.write("before write h1.js"+"<br/>");
    document.write(h1());
    document.write("after write h1.js" +"<br/>");
</script>

最初のスクリプトブロックでは、関数をロードできます。終了後、IEは新しいコードを解析します。次に、2番目のコードブロックを実行し、関数を定義します。

于 2012-05-14T10:00:21.930 に答える