「DOMContentLoadedイベントを実はよくわかっていない・・・」
「JavaScriptの起動イベント発生のタイミングで混乱している・・・」
「readyStateとは何?」
このような場合には、この記事の内容が参考となります。
この記事では、DOMツリーの読み込み・解析のタイミングについて解説しています。
本記事の内容
- DOMContentLoadedイベントはloadイベントより早い
- readyStateとは?
- DOMContentLoadedイベントとloadイベントの動作確認
それでは、上記に沿って解説していきます。
DOMContentLoadedイベントはloadイベントより早い
結論から言うと、DOMContentLoadedイベントがloadイベントより早く発生します。
DOMContentLoadedイベント
DOMContentLoadedイベントは、最初のHTML文書の読み込みと解析が完了したときに発生します。
そして、外部ファイルの読み込み完了を待ちません。
外部ファイルとは、次のようなファイルとなります。
- スタイルシート
- 画像
- サブフレーム
この理屈で言うと、画像をData URIで表示する場合は外部ファイルではありません。
Data URIについては、次の記事で説明しています。
loadイベント
loadイベントは、ページ全体が読み込まれたときに発生します。
DOMContentLoadedイベントとは逆に、外部ファイルの読み込み完了を待ちます。
もちろん、その外部ファイル読み込みの分だけ遅くなります。
まとめ
どうでしょうか?
この辺は、複雑に見えますが意外と簡単です。
では、もう少しこの辺のことを説明していきます。
readyStateというプロパティを見たことがありませんか?
readyStateは、DOMContentLoadedイベントやloadイベントと関わりがあります。
以下では、readyStateについて確認します。
readyStateとは?
readyStateプロパティは、その文書の読み込み状態を示します。
readyStateの状態は、以下のどれかになります。
- loading
- interactive
- complete
それぞれを下記で説明します。
loading
文書が、まだ読み込み中の状態です。
interactive
文書は読み込みが終わり、解析が済んだ状態です。
しかし、まだ画像、スタイルシート、フレームなどの副リソースはまだ読み込み中です。
この状態は、DOMContentLoadedイベントがもうすぐ発火することを示します。
complete
文書とすべての副リソースの読み込みが終わった状態です。
この状態は 、load イベントがもうすぐ発火することを示します。
readyStateプロパティは、イベントの発生に関連していることがわかりました。
また、readyStateプロパティの値が変化するときには、readystatechangeイベントが発生します。
そして、readystatechangeイベントはdocumentオブジェクト上で発生します。
なお、windowオブジェクトの下にdocumentオブジェクトが存在しています。
windowオブジェクトについては、次の記事で解説しています。
以上、readyStateについて説明しました。
最後は、動作確認を行います。
DOMContentLoadedイベントとloadイベントの動作確認
動作確認は、次のコードで行います。
<!DOCTYPE html> <html lang="ja"> <head> <title>readyState</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <script> console.log("start=>" + document.readyState); window.addEventListener('DOMContentLoaded', (event) => { console.log("DOMContentLoaded=>" + document.readyState); }); window.addEventListener('load', (event) => { console.log("load=>" + document.readyState); }); document.addEventListener('readystatechange', (event) => { console.log("%c" + document.readyState, "color: yellow; font-style: italic; background-color: blue;padding: 2px"); }); </script> </head> <body> </body> </html>
上記コードの実行結果は、Chrome DevToolsのコンソールで確認できます。
ここまでの内容を理解していれば、コードの説明は不要ですね。
説明がいるのは、コンソールの文字にcssを適用できることぐらいでしょうか。
以上、DOMContentLoadedイベントとloadイベントの動作確認の説明でした。