1

私はこのサンプルコードを持っています:

<!DOCTYPE html>
<html>
  <head>
    <title></title>
    <meta charset="UTF-8">
  </head>
  <body>
    <script>
      var EventHandler = {};
      EventHandler.writeNumber = function(i){
        document.write(i);
      };      

      for(var i=0; i<100; i++) {
        (function(i) {
          window.setTimeout(function() {
            EventHandler.writeNumber(i);
          },100*i);
        }(i));
      }
    </script>
  </body>
</html>

コードは毎秒ページに数字を書き込みます。Chrome26とSafari5では、正常に動作します。Firefox 18およびIE10では、1回だけ提供されます(ドキュメントに0が書き込まれます)。

に変更document.writeするとconsole.log、すべてのブラウザで機能します。何故ですか?

4

2 に答える 2

2

これは、Chrome と Safari (より正確には WebKit) のバグです。ページが解析中document.writeでない場合は を意味し、仕様ごとにすべてのタイムアウトをクリアdocument.openする必要があります。document.openそれは IE と Firefox が行うことですが、WebKit の処理document.openはあらゆる種類の壊れたものです。

于 2013-02-12T14:39:24.720 に答える
1

document.writeページの読み込み時に一度だけ機能するはずです。

ページは上から下に解析されます。解析中に見つかったすべての JavaScript はすぐに実行されます。実行が終了するかディスパッチされると (setTimeoutまたはその他の非同期処理が行われると)、ブラウザは解析を続けます。

document.write("Test")パーサーを実行するとTest、終了タグの直後にテキスト ノードが作成さ</script>れます。これは、現在まさにこの位置にあるためです。それを 1 ミリ秒遅らせるとsetTimeout、パーサーは別のポイントに移動し、テキスト ノードをページのさらに下に挿入します。

待機時間が長すぎると、パーサーはページの解析を終了し、書き込みを受け付けなくなります。または、クロムの場合、パーサーはプログラマーの障害を修正しようとし、タグの位置への参照を保持して、実際の解析が終了した後<script>も引き続き使用できるようにします。document.write

コンソールと Firebug ( F12) を使用して、何が起こるかを確認します。

一般的に話すdocument.writeことは非常に悪い習慣です。パーサーはあらゆる種類の HTML 要素に対して指定された文字列を解析する必要があるため、非常に遅くなります。代わりにdocument.createTextNodeまたはを使用してください。document.createElement

于 2013-02-11T21:40:38.830 に答える