質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

460閲覧

JavaScriptで選択項目名を取得する際、隙間をクリックした時に null を取得してしまう

donuts11

総合スコア1

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

0クリップ

投稿2022/11/08 07:37

前提

ページごとに選択肢から一つを選んでいくと
最終ページで分析結果を表示する
診断サイトを作ってみようと思います。

Javascriptは勉強しはじめたばかりで
いろいろな参考サイトを読んで
試行錯誤しているところです。

getElementById と addEventListener で
選択された項目名を取得しようと思うのですが
id で囲われた内側をクリックイベントの対象にしてしまうと
項目の隙間をクリックしたときに null が取得されてしまいます。

null の時は次のページへ飛ばないのでいいか
とも思ったのですが
ブラウザの進む戻るを使われると
null のまま次のページへ行けてしまいます。

CSSで隙間なく項目を並べたらよい気もしますが
ページデザインの選択肢が狭まるのも嫌なので
なんとかならないかと思っています。

JavaScript で
複数の選択肢(a要素やbutton要素)から一つを選んだときに
その項目名を取得する、という
よく使う手法がありましたら
教えていただけないでしょうか。

実現したいこと

  • 項目をクリックしたときだけ属性を取得したい

該当のソースコード

html

1<div id="question"> 2 <a data-no="No001" href="index2.html"> 3 <span data-no="No001">No001</span> 4 <img src="img/pic001.jpg" alt="" data-no="No001" /> 5 </a> 6 <a data-no="No002" href="index2.html"> 7 <span data-no="No002">No002</span> 8 <img src="img/pic002.jpg" alt="" data-no="No002" /> 9 </a> 10 <a data-no="No003" href="index2.html"> 11 <span data-no="No003">No003</span> 12 <img src="img/pic003.jpg" alt="" data-no="No003" /> 13 </a> 14</div> 15 16<script> 17 'use strict'; 18 const selected = document.getElementById('question'); 19 selected.addEventListener('click', number, false); 20 function number(event) { 21 let target = event.target; 22 sessionStorage.setItem('question01', target.getAttribute('data-no')); 23 } 24</script>
Cocode👏を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

問題点

  • クリックの対象は<div id="question">ではなく、<a>だと思います。
    • 3つのaタグそれぞれに.addEventListener()でイベントリスナーをつけましょう。
  • 同じdata-noを何回も書くのはやめましょう。
    • 🔺 event.target → 実際にクリックした要素
    • event.currentTarget → イベントリスナーを設定している要素
    • つまり、currentTargetを使えば、何回も同じdata-noを書く必要がなくなります。どの要素が実際にクリックされたとしても、必ずイベントリスナーを設定したaタグを指定できるからです。
    • すなわち、隙間をクリックしてnullになってしまうという現象も起きません。

完成コード例

html

1<div id="question"> 2 <a data-no="No001" href="index2.html"> 3 <span>No001</span> 4 <img src="https://placehold.jp/150x150.png" alt="" /> 5 </a> 6 <a data-no="No002" href="index2.html"> 7 <span>No002</span> 8 <img src="https://placehold.jp/150x150.png" alt="" /> 9 </a> 10 <a data-no="No003" href="index2.html"> 11 <span>No003</span> 12 <img src="https://placehold.jp/150x150.png" alt=""" /> 13 </a> 14</div>

javascript

1const aTags = document.querySelectorAll('#question a'); 2aTags.forEach(a => a.addEventListener('click', saveNumberinSessionStrage, false)); 3 4function saveNumberinSessionStrage(event) { 5 const number = event.currentTarget.getAttribute('data-no'); 6 sessionStorage.setItem('question01', number); 7}

投稿2022/11/08 08:23

Cocode

総合スコア2314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

donuts11

2022/11/11 07:52

スマートなやり方を教えていただき、ありがとうございます。 addEventListener の解説ページを見ても 複数の要素にというのが分かってませんでした。 event.currentTarget なども詳しく説明していただき助かります。 うまく動くようになりました。 まだ切り貼りの域を出ないのですが 今後も勉強していきたいと思います。 また分からないところが出てきた時はよろしくお願いします。
guest

0

条件を満たさないときはsessionStorageに書き込まないのがいいんじゃないでしょうか。

js

1 if (target.hasAttribute('data-no')) 2 sessionStorage.setItem('question01', target.getAttribute('data-no'));

投稿2022/11/08 07:54

int32_t

総合スコア20884

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

donuts11

2022/11/11 07:42

Javascriptを始めたばかりで このような if 文の条件式が書けるということを知りませんでした。 別の方のやり方がスマートなのかもということで 今回は使いませんでしたが この if 文の型は覚えておこうと思います! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問