[解決済み] innerHTMLは非同期ですか?
質問
私は自分自身を馬鹿にしないことを望みますが、私はこれらの2行のコードで何が起こっているかを理解しようとしています。
document.body.innerHTML = 'something';
alert('something else');
私が観察しているのは、HTMLが更新される前にアラートが表示されることです(あるいは、更新されていても、ページが更新/再描画/何でもされていないのかもしれません)。
次のものを見てください。 コードペン をご覧ください。
なお
alert
の中に
setTimeout(..., 0)
は役に立ちません。にはもっとイベントループが必要なようです。
innerHTML
が実際にページを更新するために、より多くのイベントループを必要とするようです。
EDITです。
書き忘れましたが、私はChromeを使用しており、他のブラウザは確認していません。Chrome でのみ表示されるようです。それでも、私はなぜそれが起こっているのかに興味があります。
どのように解決するのですか?
innerHTMLの設定は、DOMに加えることができるほとんどの変更と同様に、同期的です。しかし レンダリング のレンダリングは別の話です。
(DOM は "Document Object Model" の略であることを思い出してください。これは単なるモデルであり、データの表現です。ユーザーが画面上で見るものは、そのモデルがどのように見えるべきかのイメージです。ですから、モデルを変更したからといって、瞬時に絵が変わるわけではなく、更新に時間がかかるのです(笑)。
JavaScriptの実行とウェブページのレンダリングは、実際には別々に行われます。簡単に言うと、まずページ上のすべての JavaScript が実行されます (イベント ループからです。 この素晴らしいビデオ をご覧ください)、次に 後 の後に、ブラウザがウェブページに何らかの変更を加えてユーザーに表示することです。計算負荷の高いコードを実行すると、ブラウザが JS の実行ステップを過ぎてページのレンダリング ステップに入るのを妨げ、ページがフリーズしたり吃音になったりするからです。
Chrome のパイプラインは次のようなものです。
ご覧のとおり、すべての JavaScript が最初に実行されます。次に、ページのスタイル設定、レイアウト、描画、合成が行われます(quot;render")。このパイプラインのすべてが、毎フレーム実行されるわけではありません。どのページ要素が変更されたか(もしあれば)、そしてそれらがどのように再レンダリングされる必要があるかに依存します。
注意してください。
alert()
も同期で、JavaScript のステップの間に実行されます。そのため、ウェブページへの変更を確認する前に警告ダイアログが表示されるのです。
パイプラインの「JavaScript」ステップでは一体何が実行されるのでしょうか?すべてのコードは 1 秒間に 60 回実行されるのでしょうか? JSコードは、イベントリスナーやタイムアウトなど、スタックにある場合にのみ実行されます。以下はその例です。 前の動画 (を参照してください(本当に)。
https://developers.google.com/web/fundamentals/performance/rendering/
関連
-
[解決済み] どうすればjQueryに非同期ではなく、同期のAjaxリクエストを実行させることができますか?
-
[解決済み] jQueryを使用してdivのinnerHTMLを置き換えるには?
-
[解決済み] CSSは常にJavascriptより優先されるべきか?
-
[解決済み] 関数内で変数を変更した後、変数が変更されないのはなぜですか?- 非同期コードリファレンス
-
[解決済み] AngularJS 。非同期データでサービスを初期化する
-
[解決済み】innerText、innerHTML、valueの違い?
-
[解決済み】innerHTMLでスクリプトを挿入することは可能ですか?
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] javascriptで2つの数値を連結する方法は?
-
[解決済み] JavaScript で css プロパティを使用して HTML 要素の背景色を設定する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Node.jsでbase64エンコードされた画像をAmazon S3へアップロードする
-
[解決済み] ExtJS 4のイベントハンドリングについて
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ