BLOG

ブログ
  • Web制作

ハンバーガーメニューが動かない Cannot read properties of null

こんにちは。

気づけば今年も残すところあと1ヶ月ですね。

光陰矢の如し。まさにそんな気分です。

ハンバーガーメニューが動かない

さて、先日コーディングをしていてハンバーガーメニューがなぜか動かないという現象が起きました。

よくスマホサイトで見かける「三」こんなボタンです。
本来ならこれをタップするとメニューが展開される仕組みです。

該当の記述は下記の通りです。

【js】
  //hamburger menu
  function hamburger() {
    document.getElementById('line1').classList.toggle('active');
    document.getElementById('line2').classList.toggle('active');
    document.getElementById('line3').classList.toggle('active');
    document.getElementById('hamburger-menu').classList.toggle('active');
  }
  document.getElementById('hamburger').addEventListener('click' , function () {
    hamburger();
  } );

記述ミスがないかどうか何度も確かめましたが何故か動かない。。

エラー内容

デベロッパーツールでコンソールを見てみるとこんなエラーが出てました。

【エラー内容】
Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')

【原因】存在しない要素に対して addEventListener を使用したことでエラーが発生

エラー内容を調べてみると、特定のページで「id=”hamburger”」の要素が存在しないため、存在しない要素に対して addEventListener を使用したことでエラーが発生してしまったようです。

今回、特定のページでハンバーガーメニューを使わないページがあったのでどうやらそれが原因だったようです。

【対策】条件分岐で「id=”hamburger”」がある時だけ addEventListener を実行する

js ファイルを下記のように書き換えます。

  //hamburger menu
  function hamburger() {
    document.getElementById('line1').classList.toggle('active');
    document.getElementById('line2').classList.toggle('active');
    document.getElementById('line3').classList.toggle('active');
    document.getElementById('hamburger-menu').classList.toggle('active');
  }
  document.getElementById('hamburger').addEventListener('click' , function () {
    hamburger();
  } );

書き換える ↓

//hamburger menu
function hamburger() {
  document.getElementById('line1').classList.toggle('active');
  document.getElementById('line2').classList.toggle('active');
  document.getElementById('line3').classList.toggle('active');
  document.getElementById('hamburger-menu').classList.toggle('active');
}
const hamburgerbtn = document.getElementById('hamburger');
if (hamburgerbtn) {
  hamburgerbtn.addEventListener('click' , function () {
    hamburger();
  });

まとめ

よく使うコードはコピーして使ってしまうので、「動いて当然」という考えがありますが、条件が変わった時に時々いつも使用しているコードでもエラーになったりします。

また一つ勉強になりました。