べんりワザ・つまずいたとき

JavaScriptが動かないときの調べ方

ボタンを押しても何も起きない、書いたJavaScriptが動かない。その原因は「届いていない・エラーで止まっている・要素が見つからない・処理の中身がちがう」の4つに分けられます。上から順に切り分ける手順をまとめました。

JavaScriptが動かないときは、原因を4つに分けて上から順に確かめると、どこで止まっているかが分かります。

  1. 届いていない:JavaScriptファイルが読みこまれていない
  2. エラーで止まっている:途中で赤いエラーが出て、そこから先が動いていない
  3. 要素が見つからない:操作したいボタンや箱を探せていない
  4. 処理の中身がちがう:動いてはいるが、思ったとおりの結果になっていない

CSSとちがってJavaScriptは、まちがえるとConsoleにエラーで教えてくれます。まずはConsoleを開くところから始めます。

べんりワザ開発者ツールの使い方入門開発者ツールの開き方とConsoleの見かたはこちら4

段階1:JavaScriptファイルは届いている?

script.jsのいちばん上に、次の1行を足して再読み込みします。

console.log('script.js が読みこまれた');

Consoleにこの文字が出なければ、ファイルが読みこまれていません。

  • <script>のsrcのパス:HTMLから見た道順になっているか(js/script.jsかscript.jsか)
  • ファイル名の綴り:script.jsとscripts.jsは別物です
  • Consoleに404 (Not Found):出ていればパスのまちがいで確定です
  • <script>タグを書き忘れている:HTMLを開いて、本当に書いてあるか確認します
べんりワザパスの読み方・書き方パスの書き方はこちらで整理しています3

段階2:赤いエラーが出ていない?

Consoleに赤いエラーが出ていたら、それが原因です。JavaScriptは、エラーが1つ出るとその後ろの処理を実行しません。「途中から全部動かない」ときは、たいていこれです。

エラーはいちばん上の1つから直します。1つ目を直すと、それに引きずられていたほかのエラーも消えることがよくあります。エラー文の右端に出ているscript.js:12のような表示を押すと、問題の行に飛べます。

よく出るエラーと意味はこちらです。

エラーよくある原因
SyntaxError書き方のまちがい。{や(の閉じ忘れ、,や'の打ちまちがい
ReferenceError: xxx is not defined名前の綴りちがい、または定義より前で使っている
TypeError: Cannot read properties of null要素が見つかっていない(段階3へ)
TypeError: xxx is not a functionメソッド名の綴りちがい(addEventListnerなど)
べんりワザエラーが出ても、あわてないエラーメッセージの読み方は、こちらで実例つきで解説しています3

段階3:操作したい要素は見つかっている?

querySelectorなどで探した要素を、console.logで表示してみます。

const btn = document.querySelector('.menu-button');
console.log(btn);

nullと出たら、要素が見つかっていません。原因はほぼ次の2つです。

  • scriptが早すぎる:<head>で読みこんでいて、要素ができる前に動いている。<script src="script.js" defer>のようにdeferを付けます
  • セレクタのまちがい:.と#の取りちがえ、クラス名の綴りちがい
べんりワザ「Cannot read properties of null (reading 'addEventListener')」の直し方nullになる原因の見分け方と直し方は、こちらでくわしくまとめています

段階4:処理の中身は合っている?

エラーもなく、要素も見つかっている。それでも思ったとおりにならないときは、処理が動いているかと値が合っているかを順に確かめます。

クリックしたときに動いている?

btn.addEventListener('click', () => {
  console.log('クリックされた');
  // …ここに本来の処理…
});

ボタンを押してもConsoleに何も出なければ、イベントが登録できていません。

  • イベント名のまちがい:'click'を'onclick'や'Click'と書いていないか
  • ちがう要素に登録している:同じクラスの要素が複数あり、querySelectorが最初の1つだけを選んでいる。全部に付けるならquerySelectorAllとforEachを使います
  • 関数を呼んでしまっている:addEventListener('click', toggle())と()を付けると、登録した瞬間に1回動くだけになります。toggleと書きます

値は思ったとおり?

const count = document.querySelector('#count').value;
console.log(count, typeof count);

console.logで途中の値を表示して、どこで思ったのと違う値になるかを探します。typeofを付けると種類も分かります。

  • 数字のつもりが文字列:inputのvalueは常に文字列です。'1' + 1は'11'になります。Number(count)で数にします
  • =と===のまちがい:if (a = 1)は比べるのではなく代入してしまい、いつも真になります
  • クラス名の書き方:classList.add('.active')のように.を付けると、.activeという名前のクラスが付きます。classListでは.を付けません

それでも変わらないなら:保存とキャッシュ

  • 保存したか:タブに「●」が付いていたら未保存です
  • 見ているファイルは合っているか:似た名前のファイルを編集していないか
  • キャッシュ:⌘ + ⇧ + R / Ctrl + Shift + Rで、キャッシュを無視して再読み込みします

まとめ

  1. 原因は4つ:届いていない・エラーで止まっている・要素が見つからない・処理の中身がちがう
  2. ファイルの先頭にconsole.logを書いて、読みこまれているかを最初に確かめる
  3. 赤いエラーはいちばん上の1つから直す。1つのエラーで後ろの処理は全部止まる
  4. 要素がnullなら、deferとセレクタを確認
  5. 処理の途中にconsole.logを置いて、どこで値がずれるかを半分ずつせばめる
べんりワザCSSが反映されないときの調べ方見た目が変わらないときは、CSSの調べ方のほうをどうぞ3

よくある質問

JavaScriptが動きません。最初に何を見ればいいですか?
開発者ツールのConsoleです。赤いエラーが出ていれば、その1行がいちばんの手がかりです。エラーがなければ、ファイルの先頭にconsole.log('読みこまれた')を書いて、JavaScriptファイルがそもそも読みこまれているかを確かめます。
エラーは出ていないのに、ボタンを押しても何も起きません
クリックしたときの処理の中にconsole.logを書いて、押したときに表示されるかを確かめます。表示されなければイベントの登録先の要素がちがい、表示されるなら処理の中身にまちがいがあります。
途中から下のJavaScriptが全部動かなくなりました
JavaScriptはエラーが1つ出ると、そのファイルのそれより後ろの処理を実行しません。Consoleに出ている最初のエラーを直すと、ほかの処理も動き出すことがよくあります。