【JavaScript】DOMContentLoadedとloadの発生タイミング

【JavaScript】DOMContentLoadedとloadの発生タイミング プログラミング

「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イベントの動作確認の説明でした。

タイトルとURLをコピーしました