2009-07-30 17 views
8

私はinnerHTMLプロパティを使用してDIVを動的に修正し、数秒で終了するプロセスを報告します。問題は、Firefox上では、スクリプトが終了するまでその変更が反映されるようにページが実際に再描画されないことです。これは、アプリが低迷して感じさせる。より多くのスクリプトが実行されていても、HTMLへの変更がすぐに表示されるようにする方法はありますか?スクリプトの処理中にブラウザが強制的に再描画されるようにするにはどうすればよいですか?

答えて

14

ブラウザはシングルスレッドです。スクリプトが実行されている間は、ブラウザは何もできません。進歩率メーターのようなことをしたい場合は、setTimeout()またはsetInterval()を使用し、一定間隔で実行される小さなチャンクにタスクを分割する必要があります。これにより、スクリプト実行の間にギャップが残され、ブラウザがコントロールを再描画し、ブラウザが再描画することができます。

+0

ブラウザがシングルスレッドの場合はそうではありません。これには1つのJavaScriptスレッドがありますが、ページをレンダリングしてDOMを操作する並列スレッドがあります。 –

+0

これは実際にあなたが話している*ブラウザに依存します。現在は、マルチブラウザモデル(各ブラウザのコンテンツは別々のプロセスであり、クロムも独自のプロセスになっている)のようなクロムのようなものもあります。しかし、 'while(1)'でブラウザを簡単にハングアップさせることができます。どのくらいのブラウザがハングするかは、ブラウザの構築方法によって異なります。 – Breton

+0

while(1){}を呼び出すことによってjsスレッドをハングアップすることはできますが、これはDOM操作やコンテンツレンダリングに他のスレッドがないことを意味しません。つまり、JSスレッドが他のスレッドの実行をブロックする可能性があります。また、スレッドはブラウザのプロセスモデルとは何の関係も持た​​ないかもしれません(ページごとに1つのプロセスまたはブラウザウィンドウ全体で1つのプロセス) –

6

定期的にスクリプトを中断してみてください。長時間の処理を続行する関数であるnextFunctionが長い遅延なしに必要な中断を提供するには、

setTimeout(nextFunction, 0); 

を使用する必要があります。

関連する問題