@tasukism (住田 詩歩)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Uncaught TypeError: Cannot read properties of null (reading '') というエラー

解決したいこと

JavaScriptを使って動的なWebページを作成しようとしています。
classList を用いてクラス名の追加/削除をし、特定の要素を隠したり表示させたりしたいです。

同じHTML, CSS, JS ファイルを使って同様のスクリプトを動かしたら他の個所では想定通りの動作をするのですが、今触っている部分が動きません。

発生している問題・エラー

Uncaught TypeError: Cannot read properties of null (reading 'classList')
    at minutesSelected
    at HTMLSelectElement.onchange

該当するソースコード

<div id="mainFam" class="before withAnime">
    <div class="bgimgOn">
        <p> example </p>
        <div id="mainArea">
            <select id="detail" class="contents"  onchange="selected();">
                <option> example </option>
            </select>
        </div>
    </div>
</div>

<div id="target mainFam" class="before withAnime">
    <div class="bgimgOn">
        <p> example </p>
        <div id="mainAreaTwo">
            <select id="detailTwo" class="contents">
                <option> example </option>
            </select>
        </div>
    </div>
</div>
function selected() {
    var example = document.getElementById("target");

    var ON = document.getElementById("detail").selectedIndex;
    switch (ON) {
      case 1:
        example.classList.remove('before');
        example.classList.add('after');
        break;
      case 2:
        example.classList.remove('before');
        example.classList.add('after');
        break;
      case 3:
        example.classList.remove('before');
        example.classList.add('after');
        break;
    }
  }

.before {
    display: none;
}  

.after {
    display: block;
}

補足

上記のように、 で作成したドロップダウンリストで何かを選択したらクラスを書き換える、という命令がしたいのですが、動きません。

id="mainFam" をつけた大きなdivが2つあり、変化させたいのは下側です。

上側のdivも同様にクラスの書き換えを行うスクリプトが紐づけられており、
そちらはやりたい動きが問題なくできています。
2つのdivに対して、別々のfunctionを書いていますが、使用しているクラスが同一だからダメなのかと思い片方のクラス名を変更してみましたが、エラーは消えませんでした。

switch を使うのが悪手であれば変更して書き換えたいのですが、検索しても自分のやりたいことを実装できそうなものがうまく見当たらず困っています。
汚いコードで申し訳ありません。問題点のご指摘ご教授いただければ幸いです。

2 likes

2Answer

classとは違い、半角スペースで区切った複数の英数字をidとして指定してもスペースも含んだ文字列がidとなるだけです。
以下のサンプルでご理解頂けるでしょうか。

sample.html
<div id="target mainFam"></div>
<script>
console.log(document.getElementById('target')); // null
console.log(document.getElementById('target mainFam')); // <div id="target mainFam"></div>
</script>
2Like

Comments

  1. @tasukism

    Questioner

    サンプルまでありがとうございます。とても分かりやすいです!
    お恥ずかしながら、一つの要素に複数のidは振れないというのをすっかり忘れており、JSファイルとの連携ばかりに気を取られておりました…。
    id部分を修正したところ、やりたかった通りの動作をしてくれるようになりました!
    ありがとうございます。

下のdivにid="target mainFam"のように、空白区切りで複数のidを指定しているのが原因のように思います。

id の値にホワイトスペース文字 (空白やタブなど) を含めてはいけません。

空白区切りで並べた値を受け入れる class 属性とは対照的に、要素は ID の値をひとつだけ持つことができます。

ちなみに、idは一意でなければならないので、mainFamが2つあるのもNGとなります。

id グローバル属性は、文書全体で一意でなければならない識別子 (ID) を定義します。

1Like

Comments

  1. @tasukism

    Questioner

    複数id指定に重複使用、本当ですね。
    ご指摘いただけるまで全く気付きませんでした!
    idの部分を書き換えて重複しないように調整したところ、望んだ動作をするように修正できました。

    自分ではどこがおかしいのか全く分からず、困っていたので、とても助かりました!
    ありがとうございます。

Your answer might help someone💌