テスト用サイトにJavaScriptのテストコードを書いていたら、
console.log('aaa');すらコンソールに表示されないことがありました。
うーん、これは困った。
その時に確認していったことをまとめますので、参考にしてください。
部品化したレイアウトを通しているか?
<?php require __DIR__ . '/layouts/header.php'; ?>
テスト
<?php require __DIR__ . '/layouts/footer.php'; ?>であればOKだけれども、
<?php
echo "テスト";のように、テスト用サイトの場合、footerに書いたJavaScriptの読み込みコードが書いていない場合があります。
今回はしっかり書いていたので、これは違いました。
読み込まれているかどうかは下記の方法で確認できます。
右クリックはテスト用サイト上で行ってください。
また、[ページのソースを表示]は右クリックした後のメニューの下の方にあります。
検索して見つからない場合はJavaScriptのファイルが読み込まれていません。
見つかる場合は別の原因ということになります。
パスが壊れている
例えば
<script src="js/main.js"></script>でも、テスト用のViewのパスが
/test/index.phpだと
/test/js/main.jsを探しに行きます。
存在しないと読み込まれません。
従って、ConsoleのNetworkタブが404になっていないか確認しましょう。
途中でdie()やexitしている
PHPでよく途中でdie()やexitをして変数や配列の確認をすることがありますよね?
そのテストコードが残った状態で動かしている可能性もあります。
そうすると、footerに書いたJavaScriptまで到達できないので、確認しておきましょう。
scriptにdeferが付いている
<script src="main.js" defer></script>となっていないか確認してみてください。
scriptにdeferが付いていると、HTML解析完了後に実行されてしまうので、
DOMContentLoaded 等よりも前に実行されてしまうため、
document.addEventListener("DOMContentLoaded", ...)が既に終わったイベントとして登録されてしまうため、発火しません。
もしdeferがscriptに書いてあれば、取り除いて実行してみてください。
DOMが無い
<input id="search">が無いのに
const yoji_search = document.getElementById('search');
search.addEventListener(...)なんて書いていると当然ですが発火しません。
それどころか、エラーでスクリプトが止まります。
Consoleに赤いエラーが表示されていないか確認しましょう。
テスト用サイトのViewだけbody構造が違う
<html>が無かったり、<body>が閉じていなかったりしませんか?
こういった場合、DOMContentLoadedの挙動が変わることがあります。
自分のサイトの場合:エラーで止まっていた
JavaScriptの一番上に
console.log('JS Loaded');と書いてコンソールでJavaScriptの読み込みを確認。
その後、JavaScriptを読み込みたい場所に
console.log('DOM Loaded');と書いたがコンソールに表示されない。
それどころか、コンソールに
Uncaught TypeError: Cannot read properties of null (reading 'addEventListener') at HTMLDocument.<anonymous>という赤いエラーがたくさん出ていた。
つまり、対象の要素が無いのにaddEventListerしようとしていたことが原因でした。
なので、リスナ登録する要素がある場合は
document.addEventListener("DOMContentLoaded", function() {
const search = document.getElementById("search");
if (!search) return;
// ここから通常処理
});と要素が無い場合はreturnすればこれらのエラーを回避できるということです。
おわりに
JavaScriptには苦手意識がすごかったんだけれども、これで少し苦手意識が薄れた気がします。
直接リスナ登録するよりも先にDOMContentLoadedをリスナ登録してから書いた方が安全ですね。
少しでも参考になれば嬉しいです。
