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

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

新規登録して質問してみよう
ただいま回答率
85.49%
イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

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

Q&A

解決済

2回答

1902閲覧

JavaScriptですべてのクラスにクリックイベントを発生させる方法がわかりません。

Kosei

総合スコア13

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

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

0グッド

0クリップ

投稿2018/01/07 06:08

編集2018/01/07 08:30

今回、子孫要素をクリックした場合にも親要素の方でイベントを発生させたいので、

JavaScript

1document.addEventListener("click",function(e){ 2 if (e.target.className == "クラス名") { 3 //処理 4 } 5});

という風にはできません。
また、今回はそのクラスを持っている要素が減ったり増えたりするので、for文でやることもできません。
最終的にはjQueryを使うか、子孫要素からたどっていくしかないと思うのですが、jQueryはなるべく使いたくないので、JavaScriptで完結するとありがたいです。
よろしくお願いします。

追記

サンプルを作ってみました

HTML

1<div id="elList"> 2 <div class="parent"> 3 <div class="child1"> 4 <div class="child2"> 5 </div> 6 </div> 7 </div> 8</div> 9<button id="append">追加</button>

JavaScript

1var elList = document.getElementById("elList"); 2var append = document.getElementById("append"); 3 4append.addEventListener("click", function() { 5 elList.innerHTML += ` 6 <div class="parent"> 7 <div class="child1"> 8 <div class="child2"> 9 </div> 10 </div> 11 </div>`; 12});

CSS

1.parent { 2 width: 60px; 3 height: 60px; 4 margin: 10px; 5 background: #f00; 6} 7 8.child1 { 9 width: 40px; 10 height: 40px; 11 background: #0f0; 12} 13 14.child2 { 15 width: 20px; 16 height: 20px; 17 background: #00f 18}

JSFiddle

これで、parentやparentの子孫要素をクリックした時にイベントを発生させたいのですが、
for文でやろうとしても増えたりするのでできません。
addEventListenerのevent.targetで子孫要素まで判定するとできなくはないですが大変です。
なので、jQueryみたいにできる方法はないのでしょうか。

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

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

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

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

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

kei344

2018/01/07 06:15

どういった構造のHTMLでどの要素をクリックしたときにイベントを受け取りたいかを例示してください。
jun68ykt

2018/01/07 06:57

よりよい質問にするために、ご質問の中に「DOMイベントの “キャプチャ” や “バブリング” について理解できているかどうか」が分かるような説明あるいはコードを追記していただけると、回答者にとって、何から説明したらよいかが分かりやすくなると思われます。 (もしも、これらを初めて聞くのであれば https://qiita.com/hosomichi/items/49500fea5fdf43f59c58 などを一読すると、自己解決できるかもしれません)
guest

回答2

0

ベストアンサー

js

1document.body.addEventListener( 'click', function( e ) { 2 console.log( !!e.target.closest( '.parent' ) ); 3}, false ); 4```**動くサンプル:**[https://jsfiddle.net/y6pLrgfb/](https://jsfiddle.net/y6pLrgfb/) 5 6--- 7 8 9【Element.closest() - セレクタの条件に合う、最も近い祖先要素を取得する | DOM10[https://syncer.jp/Web/API_Interface/Reference/IDL/Element/closest/](https://syncer.jp/Web/API_Interface/Reference/IDL/Element/closest/) 11 12【Element.closest() - Web API インターフェイス | MDN13[https://developer.mozilla.org/ja/docs/Web/API/Element/closest](https://developer.mozilla.org/ja/docs/Web/API/Element/closest)

投稿2018/01/07 09:05

kei344

総合スコア69398

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

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

Kosei

2018/01/07 09:17

ありがとうございます。 望んでいた結果が見事得られました。
guest

0

とりあえず以下で実装できました。

javascript

1var targets = [ 2 "クラス名1", 3 "クラス名2" 4]; 5 6var isTarget = function(c){ 7 for(var i = 0;i < c.length;i++){ 8 if(targets.indexOf(c[i]) != -1) return true; 9 } 10 return false; 11}; 12 13document.body.addEventListener("click",function(e){ 14 if(isTarget(e.target.className.split(" "))){ 15 // 実行したいイベント処理 16 } 17},false);

targetsにイベントを実行させたいクラス名を入れていただけると、そのクラスの要素がクリックされた時にイベント処理が行われます。

JSFiddle

私自身は普段はjQueryで済ませてしまっているので、ちょっと自信ないですけど(^ ^;

投稿2018/01/07 07:03

編集2018/01/07 07:08
namnium1125

総合スコア2043

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

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

Kosei

2018/01/07 08:39

子孫要素をクリックしたときにはイベントが発生しません。 子孫要素にもすべてクラスを指定したらできますけど、大変なので親要素で子孫要素まで監視できるとありがたいです。 document.getElementsByClassName("クラス名").forEach(function(value){ value.addEventListener("click",function(){ //イベント処理 }); }); という風にすると子孫要素まで監視できますが、そのクラスの要素が増えたりするのでその方法が使えません。 何かいい方法はないでしょうか。
namnium1125

2018/01/07 09:34

返信が遅くなりすみません。 そういう意味でしたか(^ ^; 無事解決して何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問