私がまとめた次の例で何が起こっているかの背後にある解決策、または単に「ボンネットの下」の理論さえ探しています。
DOM の操作はノンブロッキング方式で行われているようです。つまり、DOM ステートメントの実行を待機するフロー制御はありません。
この例では: http://jsfiddle.net/qHVJX/
onclick イベントの後に 2 つのステートメントが実行されます。
テキストを左から右にシフト
document.getElementById('text').className = 'tr';
実行を停止するために一連の時間をループします。
for(var i = 0,temp=1000000000; i<temp;i++){var dummy=0;}
各ステートメントの実行中にフロー制御がブロックされた場合、予想どおり、テキストは左から右にシフトし、ループからの短い一時停止が続きます。代わりに、ループの反復後にテキスト シフトが発生します。
これは、ループが優先的に実行される間、className ステートメントがキューに入れられることを示唆しています。
この例では: http://jsfiddle.net/qHVJX/1/
onclick イベントの後に 3 つのステートメントが実行されます。
テキストを左から右にシフト
document.getElementById('text').className = 'tr';
実行を停止するために一連の時間をループします。
for(var i = 0,temp=1000000000; i<temp;i++){var dummy=0;}
テキストを右から左にシフトします。
document.getElementById('text').className = 'tl';
繰り返しになりますが、各ステートメントの実行中にフロー制御がブロックされた場合、予想どおり、テキストは左から右にシフトし、ループが繰り返される間に短い一時停止が続き、その後テキストが右から左にシフトします。
代わりに、ループが実行され、テキストが左から右、右から左に再描画されることはありません。これは競合状態を示しています。
ただし、setTimeout() は、DOM ステートメントが処理を実行し、キューに入れられるのを回避するのに十分な時間、実行を停止することができます。各ステートメントにかかる時間を知る方法はありません。間隔が短く設定されていると、目的の結果が得られません。間隔を必要以上に長く設定すると、パフォーマンスが低下します。
setTimeout() のオーバーヘッドなしで DOM 操作中に実行をブロックする方法はありますか? おそらくある種のコールバックルーチン?
どんな洞察も大歓迎です。ありがとう。