2016-08-15 8 views
9

この簡単な例では、https://jsfiddle.net/4rsje4b6/1/警告が表示される前に#test要素が表示されないのはなぜですか?アラートの前に要素が表示されないのはなぜですか?

jQuery css()メソッドを同期させるべきではありませんか?

#test { 
    display: none; 
} 
<span id="test">Element</span> 
$("#test").css("display", "inline"); 
alert("Showed element!"); 

UPDATE:

この動作はクロームバージョン52.0.2743.116メートルに私のために顕現され、Windowsの10

+0

まあ、それは私のために働くようです(Windows 7のFirefox 47.0.1)。今すぐあなたにスクリーンショットを送信することはできませんが、警告が表示されている間にDOMにレンダリングされた「要素」単語がはっきりと表示されます。 –

+0

イエスもFirefox 47.0.1で動作しますが、Chromeバージョン52.0.2743.116で動作が確認されています。 –

答えて

12

これは、スタイルを変更し同期的に、あなたが気づくでしょうread back the value on the next line and show it

$("#test").css("display", "inline"); 
alert("Showed element!" + $("#test").css("display")); 

しかし、スタイルオブジェクトの変更は、ページレンダラへの再描画要求メッセージをトリガし、それはブラウザがこのスクリプトルーチンが終了した後である、アイドル状態になるとすぐに処理されます。

ただし、ブラウザによって異なります。エッジではうまく動作し、要素はすぐに表示されますが、クロムとビバルディではそうではありません。

ブラウザーがこれをどのように処理するかを確認する別のテスト: ブラウザー・ウィンドウのサイズを変更すると、JSFiddleが拡大縮小されます(各領域は同じ相対サイズを保持します)。警告を開いた状態でVivaldiブラウザのサイズを変更すると、それは実行されません。実際には小さくしてから警告を表示し、それを大きくすると、メッセージボックスを閉じるまで、新しい領域に灰色の領域が表示されます。 Edgeでは、ブラウザーウィンドウ全体がグレー表示になっていても、フィーダーはバックグラウンドでサイズが変更されるだけなので、処理時間の問題ではありませんが、アラートが開いたときにChromeによってページが完全にフリーズされます。

+3

(+1)つまり、一部のブラウザでは、オブジェクトのスタイル状態と画面上の外観との関係に、スタイルの更新方法に関係なく非同期に更新される関係があります。 – apsillers

+0

答えをありがとう。これは吸う。しかし、私は警告ダイアログがもう使用されないと思います... –

+0

@apsillers確かに。別のテスト。 -edit-コメントから回答に移動しました – GolezTrol

関連する問題