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

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

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

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

7706閲覧

Javascript Tableをクリックした際に選択した行の色を変えたい

---stax---

総合スコア148

JavaScript

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

jQuery

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2019/01/21 02:52

編集2019/01/21 07:10

表題の件で質問させてください。

WEBアプリにHTMLのTableを配置し、選択した行の色を変えたいと思っています。

件数日付入力者
12019-01-20Aさん
22019-01-21Bさん

1行目をクリックすると1行の背景色が変わり
2行目をクリックすると1行目の背景色はリセットされ2行目の背景色が変わる
1行目をクリックすると2行目の背景色はリセットされ1行目の背景色が変わる
というように(分かりにくくてすいません)クリックされた行のみ背景色を変え、それ以外の行の背景色はデフォルトにしたいです

同様のケースを調べながら以下のサンプルを作ってみたのですが、1行目をクリックして色が変わるのは良いのですが、2行目をクリックしたときは1行目の背景色は変更されたままでクリックのたびに色が変わるという目的の動作が出来ていません。

クリックの度に色を切り替えるというのはどのように考えて作ればよいでしょうか
cssで個別に指定するのかと考えたのですが行の数は可変するので各行にidを付けれずどのようにすればよいか行き詰ってしまいました
初歩的な質問で申し訳ありませんがアドバイス頂きたいです
宜しくお願い致します

html

1 2<table id="test"> 3 <tr> 4 <th>件数</th><th>日付</th><th>入力者</th> 5 </tr> 6 <tr> 7 <td>1</td><td>2019-01-20</td><td>Aさん</td> 8 </tr> 9 <tr> 10 <td>2</td><td>2019-01-21</td><td>Bさん</td> 11 </tr> 12</table>

css

1td { 2 background-color: #FFFF; 3} 4.colorchange { 5 background-color: red; 6}

js

1$( function() { 2 $( '#test tr' ).on( 'click', function() { 3 $( this ).children().not( 'th' ).toggleClass( 'colorchange' ); 4 } ); 5} );

質問追記---------------------------------------------------------

回答頂いた方ありがとうございます。
頂いたコードはjsfiddleで目的の動作を確認致しました。
ただ、自分の実際の開発環境では動作しませんでした。

自分なりに調査した結果、HTMLファイルに直接記入したものは上手く動作して、javascriptで処理の中で作成したものでは動作しませんでした。
このようなケースは稀なのかもしれませんが、当方知識が浅く、どのように調べてよいかもわからず行き詰っています。

自分の作成しているアプリは質問欄の表でいう以下のtbodyにあたる部分をjavascriptで生成しています。

12019-01-20Aさん
22019-01-21Bさん

規模が大きいので全文掲載出来ないのですが、以下がHTMLファイルのテーブルタグの部分

html

1<table id="datatable"class="table is-bordered is-hoverable is-fullwidth"> 2 <thead> 3 <tr class="is-selected" style="background-color: rgb(112, 112, 218)"> 4 <th>件数</th> <th>入力時間</th> 5 </tr> 6 </thead> 7 <tbody id="tablebody"> 8 9 </tbody> 10</table>

以下がjsファイルでコメント記入している部分がHTMLを生成している部分になります
$('#tablebody').append( tr );の部分です
このように作成したHTMLでは所望の動作をしません
選択した箇所の色の変更が適応されるのはHTMLで記載した<thead>内の<tr>だけでした

js

1//table 内容作成 2function dataTable(tabelDate) { 3 if (tabelDate.length > 0) { 4 for (var i = 0; i < tabelDate.length; i++) { 5 var lenCount = i + 1; 6 var doc = tabelDate[i]; 7 var dateObj = [new Date(doc.date)]; 8 var strDate = dateObj.toLocaleString() 9 var sliceStrDate = strDate.slice(0, 18) 10 var tr = `<tr><td> ${lenCount} </td><td> ${sliceStrDate} </td></tr>`; //HTMLタグを生成している部分 11 console.log(tr) 12 $('#tablebody').append( tr ); 13 } 14 } 15 }, 16 error: function () { 17 console.log('error'); 18 } 19 }); 20};

以下のようにjavascriptで生成されるものをあらかじめHTMLファイルに記載しておくとどの行を選択しても色が変わり所望の動作をします

html

1<table id="datatable"class="table is-bordered is-hoverable is-fullwidth"> 2 3<thead> 4 <tr> 5 <th>件数</th> <th>入力時間</th> 6 </tr> 7</thead> 8 9<tbody id="tbody"> 10 <tr onClick="click('Tue Jan 20 2019 09:07:00 GMT+0900 (日本標準時)')"> 11 <td> 1 </td> 12 <td> 2019/1/15 9:07:00 </td> 13 </tr> 14 15 <tr onClick="click('Tue Jan 20 2019 11:31:00 GMT+0900 (日本標準時)')"> 16 <td> 2 </td> 17 <td> 2019/1/15 11:31:00 </td> 18 </tr> 19 20 <tr onClick="click('Tue Jan 20 2019 16:04:03 GMT+0900 (日本標準時)')"> 21 <td> 3 </td> 22 <td> 2019/1/15 16:04:03 </td> 23 </tr> 24 25</tbody> 26</table>

自分で調べて分かったのが上記の部分までで何が原因でどう対処すればよいのか分からず悩んでいます。
説明が分かりにくい部分があるかと思いますがどのような対処法が考えられるかアドバイス頂きたいです。
重ねて質問して申し訳ありませんが宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

javascript

1$( function() { 2 $( '#test tr' ).on( 'click', function() { 3 $('.colorchange').removeClass('colorchange'); 4 $(this).children('td').addClass('colorchange'); 5 }) 6});

最初に全消去すればよいです

追記への回答

jqueryオブジェクトは実行した時点のHTMLから作成されます。
よって、$( '#test tr' )は、このメソッドを実行した時点のHTMLから作成されます。

要するに、javascirptで上記の条件('#test tr')に合う要素を、後から作ってもclickイベントは反応しないという事です。

このような場合JQuery.onのselector引数を使います。

javascript

1 $( '#test' ).on( 'click', 'tr', function() { 2 $('.colorchange').removeClass('colorchange'); 3 $(this).children('td').addClass('colorchange'); 4 })

selector引数の詳しい解説は面倒なのでご自身で調べて下さい。

投稿2019/01/21 03:07

編集2019/01/21 07:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

---stax---

2019/01/21 07:12

回答ありがとうございます。 回答頂いたコードで所望の動作を確認出来ました。 丁寧な回答ありがとうございます。 重ねて申し訳ないのですが質問を追記させて頂きました。 お手数おかけしますが宜しくお願い致します。
---stax---

2019/01/21 23:41

回答ありがとうございます。 返答遅れて申し訳ございません。 頂いたコードで目的の動作が確認出来ました。 行き詰っていたので本当に助かりました。 js側で新たに追加されたDOMに影響を与えないことを初めて知りました。 今回詰まったところの理解とjqueryの学習も進めていこうと思います。 ありがとうございました。
guest

0

toggleしたいならこう

javascript

1<style> 2tr{ 3 background-color: white; 4} 5tr.colorchange { 6 background-color: red; 7} 8</style> 9<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 10<script> 11$(function(){ 12 $('#test tbody tr').on('click',function(){ 13 $(this).toggleClass('colorchange').siblings().removeClass('colorchange'); 14 }); 15}); 16</script> 17<table id="test"> 18<thead> 19<tr> 20<th>件数</th><th>日付</th><th>入力者</th> 21</tr> 22</thead> 23<tbody> 24<tr> 25<td>1</td><td>2019-01-20</td><td>Aさん</td> 26</tr> 27<tr> 28<td>2</td><td>2019-01-21</td><td>Bさん</td> 29</tr> 30<tr> 31<td>3</td><td>2019-01-22</td><td>Cさん</td> 32</tr> 33</tbody> 34</table> 35

元のスタイルシートはtrとtd別々に背景色を換えているのでNG
またthを見て判断するのではなくヘッダはtheadを利用してください

投稿2019/01/21 03:14

yambejp

総合スコア114769

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

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

---stax---

2019/01/21 07:12

回答ありがとうございます。 回答頂いたコードで所望の動作を確認出来ました。 丁寧な回答ありがとうございます。 重ねて申し訳ないのですが質問を追記させて頂きました。 お手数おかけしますが宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問