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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

1912閲覧

javascript: onClickについて

nanase21

総合スコア144

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2019/09/16 00:13

編集2019/09/16 02:42

[codepen]動くサンプル

実現したい事

div要素にonclickを設定し、対象のdivがクリックされた時に、要素内のテキストを取得し、input textに反映させたい。

困っている事

サーバーから返ってくるデータの数によってdivの要素数が異なるため、事前にidonclickを設定できずにいる。
文章で説明するのがあまり得意じゃないため、リンク先のcodepenを見て頂きたいのですが、hoge2やhoge3をクリックするとhoge1の要素を取得し、処理が実行されてしまうのを意図した動きにしたい。

html

1<div class="div-btn" id="btn1" onclick="func_1()"> 2 <div class="input" id="input1">hoge1</div> 3</div> 4<div class="div-btn" id="btn2" onclick="func_1()"> 5 <div class="input" id="input2">hoge2</div> 6</div> 7<div class="div-btn" id="btn3" onclick="func_1()"> 8 <div class="input" id="input3">hoge3</div> 9</div> 10 11<p>ココにクリックしたdivのinputのバリューが反映される</p> 12<input type="text" class="input" id="res">

js

1function func_1(){ 2 //ココで取得しているgetElementByIdが動的に変わってくれれば解決するはず。 3 let el = document.getElementById( "btn1" ); 4 el.style.background="red"; 5 //ココで取得しているgetElementByIdが動的に変わってくれれば解決するはず。 6 let input = document.getElementById("input1").textContent; 7 document.getElementById("res").value = input; 8}

#追記
kei344さんとhatena19さんからご教示いただいコードを参考に以下のように修正する事で解決しました。
ご教示頂きありがとうございました。

css

1.active { 2 background-color: red; 3}

js

1function func_1(button){ 2 var elements = document.getElementsByClassName("div-btn"); 3 for(i=0;i<elements.length;i++){ 4 elements[i].classList.remove("active"); 5 } 6 button.classList.add("active"); 7 let input = button.firstElementChild.textContent; 8 document.getElementById("res").value = input; 9} 10}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/09/16 00:24

jQuery は使わない条件ですか?
nanase21

2019/09/16 00:27

はい。出来ればjavascript(ES6)で書きたいです。 でも、jqueryの方が簡単であればjqueryも検討したいと考えています。
退会済みユーザー

退会済みユーザー

2019/09/16 01:00

jQuery を使った方が簡単に (少ない行数で) 書けるのは間違いないです。jQuery を使わないことにこだわる理由はないのでは?
nanase21

2019/09/16 01:05

これといった理由は無いのですが勉強の一環で、プログラミングを勉強しているため極力ES6で書けたらいいなと思っています。(理由が浅くてすいません...)
guest

回答3

0

ベストアンサー

プログラミングを勉強しているため極力ES6で書けたらいいなと思っています。

Vanilla JS で、現状のコードを活かすなら、

html

1<div class="div-btn" id="btn1" onclick="func_1(this)"> 2 <div class="input" id="input1">hoge1</div> 3</div> 4<div class="div-btn" id="btn2" onclick="func_1(this)"> 5 <div class="input" id="input2">hoge2</div> 6</div> 7<div class="div-btn" id="btn3" onclick="func_1(this)"> 8 <div class="input" id="input3">hoge3</div> 9</div> 10 11<p>ココにクリックしたdivのinputのバリューが反映される</p> 12<input type="text" class="input" id="res">

js

1function func_1(button){ 2 button.style.background="red"; 3 let input = button.firstElementChild.textContent; 4 document.getElementById("res").value = input; 5}

onclick の function の引数にthisを渡すことで、クリックした要素を取得できます。


コメントでの要望の、クリックした以外の要素の背景色を戻す処理を追加しました。

js

1function func_1(button){ 2 var elements = document.getElementsByClassName("div-btn"); 3 for(i=0;i<elements.length;i++){ 4 elements[i].style.backgroundColor = "lightgray"; 5 } 6 button.style.background="red"; 7 let input = button.firstElementChild.textContent; 8 document.getElementById("res").value = input; 9}

getElementsByClassName は複数の要素を返しますので(Elementsと複数形になっていることに注目してください)、forループですべての div-btn の背景色を戻しています。

投稿2019/09/16 01:54

編集2019/09/16 02:37
hatena19

総合スコア33699

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

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

nanase21

2019/09/16 02:16

ご教示いただきありがとうございます。 ほとんど私の意図した処理になりました。 一点だけ、追加でご教示いただきたい事があります。 現状ですと、一度クリックするとずっとバックグランドカラーが赤になったままですが、これを トグルみたいな形で他のdivをクリックしたときは、それ以外のdivは元のカラーに戻るみたいな処理をしたいときはどのようにすれば良いかご教示いただけないでしょうか?
nanase21

2019/09/16 02:36

ありがとうございます。 意図した処理になりました。 最後にもう一つだけお聞きしたいのですが、下記のコードを書いたところ処理が実行されなかったのですが、要素を削除するremoveを使う場合は必ず対象の要素に削除したいclassが存在しないといけないのでしょうか? もしお分かりですあれば、ご教示いただけると幸いです。 document.getElementsByClassName("div-btn").classList.remove("active");
nanase21

2019/09/16 02:38

ありがとうござます。 for文を見て理解しました。
hatena19

2019/09/16 02:39

回答の追記のようにforループで、要素一つずつに対して classList.remove してください。
guest

0

簡単な jQuery で。

CSS

1.active { 2 background-color: red; 3}

js

1$( function() { 2 var $tgt = $( '#res' ); 3 var $btn = $( '.div-btn' ); 4 $btn.on( 'click', function( e ) { 5 $btn.removeClass( 'active' ); 6 $( this ).addClass( 'active' ); 7 $tgt.val( $( this ).find( '.input' ).text() ); 8 } ); 9} ); 10```**動くサンプル:**[https://jsfiddle.net/oht6Leza/](https://jsfiddle.net/oht6Leza/)

投稿2019/09/16 01:09

編集2019/09/16 01:58
kei344

総合スコア69400

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

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

kei344

2019/09/16 02:28

getElementsByClassNameは複数の要素が入っているからjQuery のような書き方はできません。 「getElementsByClassName」で検索してください。
nanase21

2019/09/16 02:44

ご教示頂きありがとうございます。 keiさんからご教示いただいた実装を参考にさせていただきながらjsに書き換えさせて頂きました。 ありがとうございました。
guest

0

jQuery はなるべく使いたくないとのことですので・・・

であれば、例えば、対象とする複数の div 要素全体をさらに div で囲ってその click イベントにリスナをアタッチし、バブリングで上がってくるイベントをそのリスナで捉えて処理してはいかがですか?

【追記】

キャプチャリングとバブリングのサンプルの記事を紹介しておきます。

キャプチャリングとバブリング
http://surferonwww.info/BlogEngine/post/2012/12/01/capturing-target-and-bubbling-phases.aspx

記事のサンプルコードは記事の中で「実験室」としたリンク先で実際に動かして試すことができますので、興味があればどうぞ。

投稿2019/09/16 01:23

編集2019/09/16 01:47
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問