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

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

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

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

Q&A

解決済

1回答

1071閲覧

javascriptで複数の要素に対して同様のイベントを発生させたいがイベントが発生しない(モーダルウィンドウの例)

unozora

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2020/04/09 14:08

javascript

1//クリックした時にモーダルが展開するトリガーとなる要素の取得 2let modalTrigger = document.getElementById("modal-open"); 3//上記で取得した要素のdata属性を取得 4let modalData = modalTrigger.dataset.target; 5//上記で取得したdata属性の内容と一致するidを持つ要素(当該モーダルの内容)を取得 6let modal = document.getElementById(modalData); 7 8let modalOpen = function() { 9 modal.classList.remove("--hidden"); 10 modal.classList.add("--visible"); 11} 12 13modalTrigger.addEventListener('click', modalOpen); 14

javascriptを使用してモーダルウィンドウを製作しています。
流れとしては

  1. モーダルが展開する要素をクリック
  2. data属性を取得
  3. その内容と一致するidの持つ要素(モーダル部分)が展開される

のような流れで製作したのですが上手く動きません。

また、クリックイベントのターゲットとなる要素を(> let modalTrigger = document.querySelectorAll(".modal-open");)
で指定したのですが

for (let i = 0; i < modalTrigger.length; i++) {
modalTrigger[i].addEventListener('click', alerts);
}

と記述してもクリックイベントがすべての要素に適応されるどころか、クリックベントが発生しません。

複数の要素に対して同じクリックイベントを発生させるにはどのようにしたほうがよろしいでしょうか?
また、モーダルウィンドウの制作にあたってもっと良いやり方などがあればご教授お願いいたします。

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

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

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

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

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

kei344

2020/04/09 14:15

HTMLを含めたコード全体をコードブロックで追記することをお勧めします。
storm3

2020/04/09 15:27

質問が2つあるので、次回からはどちらかに絞ってそれが解決したらもうひとつ質問を別でしたほうがよいです。 ①モーダルウィンドウが動かない ②for文でクリックイベントがすべての要素が適応されない まず、どこまで思った通りに動いているかを教えてください。 ブラウザのデベロッパーツール(F12で開くやつ)にエラーがでていないかどうか。 またエラーが出ていない場合は、console.log()を埋め込んでどこまで思った通り動いているかを確認してみてください。 コードを観た感じクラス名が--hedden、--visibleとなっている個所以外は問題なさそうなので、単純にjavascriptを実行するタイミングがタグの描画より早いだけではないでしょうか?
guest

回答1

0

ベストアンサー

下記のコードからすると、複数の要素に同じidを指定して取得しようとしている様に見えます。

let modalTrigger = document.getElementById("modal-open");

JavaScriptでは同じidが複数あっても最初の1つしか取得できません。
(console.logでmodalTriggerを見ても1つしか取れていないと思います。)

基本的には、同じ名前のidは1ページ中に1つです。

idではなくdata属性またはclassに変更し、
querySelectorAllを使ってNodeListで取得すればいいと思います。

投稿2020/04/21 16:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問