JavaScriptのDOMContentLoadedとloadイベントの違いを理解しよう
生徒
「Webページが完全に読み込まれたタイミングで処理をしたい場合、どのイベントを使えばいいですか?」
先生
「JavaScriptには主にDOMContentLoadedとloadの2つのイベントがあります。それぞれ動作のタイミングが違うので使い分けが重要です。」
生徒
「違いって具体的には何ですか?」
先生
「簡単に言うと、DOMContentLoadedはHTMLの読み込みが終わったタイミング、loadは画像やスタイルシートなども含めたすべての読み込みが終わったタイミングで発火します。」
1. DOMContentLoadedイベントとは?
DOMContentLoadedは、HTML文書の解析が完了してDOMツリーが構築されたときに発火します。外部リソースの読み込みを待たずに実行できるので、スクリプトの初期化処理によく使われます。
document.addEventListener("DOMContentLoaded", () => {
console.log("DOMの読み込みが完了しました。");
const button = document.getElementById("myButton");
button.addEventListener("click", () => {
alert("ボタンがクリックされました!");
});
});
このように、DOMが使える状態になったらすぐにスクリプトを実行できるので、ユーザーの操作に素早く対応できます。
2. loadイベントとは?
loadイベントは、ページ内のすべてのリソース、例えば画像、スタイルシート、iframeなどが完全に読み込まれたあとに発火します。ページ全体の読み込み完了を確認したい場合に使います。
window.addEventListener("load", () => {
console.log("ページ全体の読み込みが完了しました。");
const images = document.querySelectorAll("img");
console.log("画像の数:", images.length);
});
画像が多いページではloadイベントの発火が遅れることがあります。ユーザーにすぐインタラクションを提供したい場合はDOMContentLoadedを使う方が適しています。
3. DOMContentLoadedとloadの使い分け
簡単に使い分けをまとめると次の通りです。
- ページのHTML構造だけを操作したいとき →
DOMContentLoaded - 画像や外部リソースの読み込み完了を待ってから処理したいとき →
load
例えば、ページの初期化処理やボタンのクリックイベントの設定はDOMContentLoadedで十分です。一方で、ページ内のすべての画像を確認してレイアウトを調整したい場合はloadを使うと安全です。
4. 注意点とおすすめの書き方
非同期的にHTMLや画像が読み込まれる現代のWebでは、イベントのタイミングを正しく理解することが重要です。以下の点に注意しましょう。
- JavaScriptを
headに書く場合はDOMContentLoadedでDOMを操作する。 - 外部画像や大きなメディアファイルの読み込みに依存する処理は
loadを使う。 - 両方のイベントを混同すると、処理が早すぎたり遅すぎたりするのでタイミングを意識する。
正しいイベントを選ぶことで、ユーザーに快適な操作体験を提供できます。
5. 実務でよくある使い分けの具体例
実際の開発現場では、DOMContentLoadedとloadを状況に応じて使い分けることが重要です。例えばフォーム入力やボタン操作など、ユーザーの操作にすぐ反応したい処理はDOMContentLoadedが適しています。一方で画像サイズを取得してレイアウトを調整する場合は、画像の読み込み完了が必要なためloadを使う必要があります。
document.addEventListener("DOMContentLoaded", () => {
const input = document.getElementById("name");
input.addEventListener("input", () => {
console.log("入力されました");
});
});
入力イベントがすぐに反応する
このように、ユーザー操作系は早く動くDOMContentLoadedを使うのが基本です。
6. よくあるエラーと対処法
初心者の方がよく経験するのが、要素が取得できずにエラーになる問題です。これはDOMがまだ構築されていない状態で要素を取得しようとしている場合に発生します。この場合はDOMContentLoadedを使うことで解決できます。
const btn = document.getElementById("btn");
btn.addEventListener("click", () => {
console.log("クリックされました");
});
エラーが発生する可能性がある
このコードはHTMLが読み込まれる前に実行されるとエラーになります。以下のように修正しましょう。
document.addEventListener("DOMContentLoaded", () => {
const btn = document.getElementById("btn");
btn.addEventListener("click", () => {
console.log("クリックされました");
});
});
安全にイベントが設定される
このようにイベントのタイミングを意識することで、安定したコードを書くことができます。
7. パフォーマンスとユーザー体験の関係
DOMContentLoadedとloadの選択は、パフォーマンスやユーザー体験にも大きく影響します。ページの表示が遅いとユーザーは離脱しやすくなるため、必要以上にloadを使うのは避けるべきです。特に画像が多いページでは、すべての読み込みを待つと処理が遅くなります。
window.addEventListener("load", () => {
console.log("すべてのリソースが読み込まれました");
});
読み込み完了まで時間がかかる場合がある
一方で、必要な場面では確実にloadを使うことが重要です。例えば画像のサイズを使ってレイアウトを決める場合などです。状況に応じて最適なイベントを選ぶことが、快適なWebページ作成につながります。