[JavaScript] DOMContentLoadedとscriptタグ直書きの処理実行タイミング
- 「DOMContentLoaded」でリスナー登録したイベント処理と、scriptタグに直接書いた処理の実行タイミングを整理しようと思い、いくつかサンプルコードを作成、実行結果を確認してみました
 
「DOMContentLoaded」イベントとscriptタグ直書きの実行順
<script>
    document.addEventListener('DOMContentLoaded', function() {
        console.log('DOMContentLoaded');
    }, false);
</script>
<script>
    console.log('scriptタグ直書き');
</script>
    - 「DOMContentLoaded」イベントでログ出力する場合と、scriptタグでログ出力する場合の実行タイミングを確認します
 
実行結果
scriptタグ直書き
DOMContentLoaded
        - scriptタグ直書きの処理が先に実行され、そのあとに「DOMContentLoaded」イベントの処理が実行されました
 - html文書内にscriptタグがあった場合、その処理が実行されるまで「DOMContentLoaded」イベントの処理は実行されないということになります
 - 「DOMContentLoaded」の定義は以下のようになっています(MDN web docs様より引用)
 
DOMContentLoaded イベントは、 HTML の初期文書が完全に読み込まれ解釈された時点で発生し、スタイルシート、画像、サブフレームの読み込みが完了するのを待ちません。
- ここで言う「HTMLの初期文書」はscriptタグ内に記載した処理も含まれるという認識でよさそうです
 
scriptタグを書いた位置による要素の参照可否
<div id="sample"></div>
<script>
    const check = document.getElementById('sample') !== null ? 'OK' : 'NG';
    console.log(check);
</script>
    - scriptタグの書いた位置によって、DOM要素の参照可否が変わるかどうかの確認です
 - sampleのidが振られたdiv要素を取得し、要素取得ができていれば「OK」と出力、できていなければ「NG」と出力します
 
OK
    - 問題なく要素にアクセスできました
 
<script>
    const check = document.getElementById('sample') !== null ? 'OK' : 'NG';
    console.log(check);
</script>
<div id="sample">サンプル</div>
    - 今度は要素の前にscriptタグを書くようにします
 
NG
    - 要素へのアクセスはできませんでした
 - この結果から、html文書の解析は通常のタグもscriptタグも区別なく上から順番に進められ、解析前の要素を参照することはできないことがわかります
 
要素の中にscriptタグを書いた場合
<div id="sample">
    <script>
        const check = document.getElementById('sample') !== null ? 'OK' : 'NG';
        console.log(check);
    </script>
</div>
    - 要素の中にscriptタグを書いた場合、その要素の参照が可能かどうかの確認です
 
OK
    - 参照できました。親である要素を参照することは可能なようです
 - タグが閉じられる前なので参照できないかと思いましたが、少し意外な結果でした
 
ご質問など受け付けています
記事の中でわかりにくかったところ、もっと知りたかったこと、間違っていることなど、何でもお気軽にご連絡ください。
ご連絡は下記フォームを利用いただくか、ツイッターアカウント@flat8migi宛てでもOKです。