JavaScriptの読み込み方 — script タグを書く位置でつまずかない
JavaScriptが動かない原因の上位が、読み込む位置の問題です。script タグをどこに書くか、defer とは何かを、最初に押さえておきましょう。
JavaScriptの最初の関門は、文法ではなく読み込みです。コードが正しくても、書く場所を間違えると動きません。しかもエラーの文面が不親切なので、初心者ほど原因にたどり着けません。
外部ファイルに書いて、読み込むのが基本
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>サンプル</title>
<script src="script.js" defer></script>
</head>
<body>
<button id="btn">押す</button>
</body>
</html>なぜ defer を付けるのか
ブラウザはHTMLを上から順に読みます。head の中で普通に script を読み込むと、まだ body が読まれていない段階でJavaScriptが実行されます。すると「ボタンを探したけれど見つからない」という状態になり、動きません。
defer を付けると、HTMLをぜんぶ読み終えてから実行されるようになります。読み込み自体はHTMLと並行して進むので、速度も落ちません。迷ったら head に書いて defer を付ける、と覚えておけば大丈夫です。
- head + defer … HTMLを読み終えてから実行。基本はこれ
- body の閉じタグ直前 … 昔からある方法。これも動く
- head に defer なし … 要素が見つからず動かないことが多い。避ける
最初の1行で、動いているか確かめる
書いたJavaScriptが読み込まれているかどうかは、1行書けば確認できます。console.log は、ブラウザの検証ツールに文字を出す命令です。
script.js
console.log("script.js が読み込まれました");検証ツールのコンソールにこの文字が出れば、ファイルは確実に読み込まれています。出なければ、パスの間違いか、読み込み自体ができていないということです。原因の切り分けが一気に進みます。
動かして確かめる
下のデモでは script.js タブにコードが入っています。console.log の代わりに、画面に文字を出す形にしてあります。
script.js の文字を書き換えると、プレビューの表示も変わります。テキストを変えて実行してみてください。
よくある失敗
- src のパスが違う(js/script.js なのに script.js と書いている)
- 閉じタグを書いていない(script は必ず </script> が要る)
- HTMLに書いた id と、JavaScript側の綴りが違う
- defer を付け忘れて、要素より先に実行されている
次は、その「要素を見つける」部分を詳しく見ていきます。ここが分かると、できることが一気に増えます。