JavaScriptエラー Cannot read property 'addEventListener' of null

JavaScriptエラー Cannot read property 'addEventListener' of null

 

 

HTML文

 

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title>JS Practice</title>

    <link rel="stylesheet" href="style.css" charset="utf-8">

    <script src="./main.js"></script>

  </head>

  <body>

    <h1 id="title">タイトル</h1>

    <img src="himawari.jpg" width="360"/>

    <h2 class="sub-title">サブタイトル</h2>

    <p>

      コンテンツコンテンツコンテンツコンテンツ<br>

      コンテンツコンテンツコンテンツコンテンツ<br>

      コンテンツコンテンツコンテンツコンテンツ<br>

      コンテンツコンテンツコンテンツコンテンツ<br>

    </p>

    <div class="blue">青青青青青</div>

    <button id="Button">ボタン</button>

    <button id="Button2">ボタン2</button>

    <button id="Button3">クラス追加</button>

    <button id="Button4">クラス削除</button></br>

 

    <footer>

        <a href="#" class="next">次へ</a>

    </footer>

  </body>

</html>

 

 

JavaScript

 

let btn = document.querySelector("button");

 

function a(){

console.log("helloworld");

}

 

btn.addEventListener("click",a);

 

 

これを実行したら、表題のようなエラーが出た。

Cannot read property 'addEventListener' of null

この理由は、JavaScriptは上から順番に読み込んでいくため、発生した。

どういうことかというと、

HTMLでJavaScriptを読み込むところというのは、

上から7行目の

<script src="./main.js"></script>

で読み込まれる。

しかし、その時点ではまだ値を受け取りたい

<button id="Button">ボタン</button>

ここまで読み込まれていないのが現状だ。

 

なので、「null」というエラーになる。

 

 

【解決策】

window.onload

というのを使う。

(※他にもイベントリスナで解決することもできる。)

 

 

書き方としては

 

window.onload = function(){処理内容};

 

となる。

この処理内容というのが、上記で

「行いたかったけど行えなかった処理」

だ。

なので、「処理内容」の中にはそのまま入れ込んで仕舞えばいい。

ただ、コードが読みにくくなるので、一度処理内容だけ関数で取り出したいので

関数cとして取り出してしまい、

 

function c (){

 

let btn = document.querySelector("button");

 

function a(){

console.log("helloworld");

};

 

btn.addEventListener("click",a);};

 

ーーーーーーーーーーーーーーーーーーーーーー(ここまでが取り出す作業)

 

window.onload = function(){

  c();

};

 

ーーーーーーーーーーーーーーーーーーーーーーーーー(この中がエラーを解決するコード)

 

 

これによって、いったん全て読み込んでから、JavaScriptが適用されるということになり、

エラーにならずに進めることができる。

 

 

【まとめ】

HTMLにJavaScriptを読み込ませたい時は

読み込む順番を意識して置く必要があり、エラーに対処する必要があるようです。