2016-11-07 7 views
-2
document.write('Test.'); 
while (true) 1; 

ブラウザに最初にテキストを表示してから、無限ループにジャンプします。しかし、私はテキストが表示されません。ブラウザを行ごとに強制的に移動させる方法は?私は、ブラウザに最初の行が終了するのを待つように指示する単純な関数を探しています。そんなことはありますか? waitForEverythingToFinish()のようになります。 window.getComputedStyle(div).getPropertyValue('height')を使用して強制的に再描画します。テキストを表示するにはどうすればいいですか?

+2

ブラウザが「表示」しようとする前でも、ブラウザは無限ループに入り、ストールします。そして、 'document.write()'を使わないでください。 –

+0

これはどのように変更できますか?それは単に問題の非常に単純化されたイラストです。実際のコードには 'document.write()'は含まれていません。 –

+1

@TamásBolváriしないでください?なぜブラウザを停止したいのですか?タブがクラッシュします。 – Brad

答えて

1

私はあなたのコメントに基づいて、この問題の本質は、それが長時間実行同期タスクを開始しする前にブラウザ画面を更新するための時間を持っていることを確認したいということだと思います。できるだけブラウザが画面を更新するので、メインスレッドをブロックすると、更新されたUIを取得できなくなります。これは、単純なタイムアウトで可能でなければならない、またはコメントが示唆したように、​​。

シンプルタイムアウト:

// For example, document.write(...) 
funcThatChangesScreen(); 

setTimeout(function() { 
    // For example, lots of heavy calculations 
    synchronousFuncThatTakesALongTime(); 
}, 100); 

JSFiddle比較:

または、requestAnimationFrameを参照してください。

編集:コメントの他の人が指摘しているように、これは本当にあなたが望むものを得るための最良の方法ではありません。長期実行同期タスクを使用している場合は、WebWorkerに委譲するか、非同期にするのが最適です。このタイムアウト解決策では、ユーザーは画面上のテキストを見ることができますが、上記のJSFiddlesのように、UIをブロックしてしまいます。

+0

ブラウザで画面を更新できないのですが、何を待っていますか?待っているものがあれば、それを止める方法があるはずです。私は 'document.write( 'Test。');'にそれを依頼するとまだ忙しくはありません。とにかく、あなたは私の質問に完全に答えましたが、これを追加することができます:[requestAnimationFrameで](https://jsfiddle.net/ruLf0rkg/2/)? –

+1

@TamásBolvári - ブラウザは一度に1つのことしか行えません。ユーザーが見るための画面をペイントします。ブラウザは、スクリーンUIをリフレッシュするために他に何もしなくなるまで待つことでスマートになるようにします。そうしないと、ほぼすべてのコード行の後に再ペイントすると、すべてがずっと遅くなります。詳細については、[JSマルチスレッドに関するこの回答](http://stackoverflow.com/questions/7909593/is-it-possible-to-thread-javascript-and-keep-access-to-the-ui)を参照してください。 requestAnimationFrameの議論は[ここ](https://css-tricks.com/using-requestanimationframe/)です。 –

-1

これがあなたの目的に適しているかどうかを確認してください。

if(!document.write('Test.')){ 
    while (true) 1; 
} 
+0

不幸なことにそれはしません。 –

関連する問題