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

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

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

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

HTML

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

Q&A

解決済

3回答

477閲覧

同じクラス名のテーブルに別々の処理をしたい

HIROYUKI.I

総合スコア7

jQuery

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

HTML

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

0グッド

1クリップ

投稿2018/02/24 12:24

編集2018/02/24 15:52

前提・実現したいこと

HTMLのテーブルで、マウスオーバーした際に行と列の背景色が変わるようにしたいのですが、同じページ内に同じクラス名(.stripeTable)のテーブルが複数あると、マウスオーバーしていないテーブルにも影響を与えてしまいます。
背景色の変更は、ページ内にテーブルが1つしかない時にはうまく反映されています。
最悪、各テーブルごとにIDかクラス名を変えて、それぞれに対応したスクリプトを用意すれば対応できるのでしょうが、eachや$(this)などを使ってうまくやれるのではないかというところで行き詰まっております。
よい対処方法がありましたらよろしくお願いいたします。

【追記】
テーブルは1行目の<tr>内は全て<th>
2行目以降は<tr>内の最初だけ<th>で、残りは全て<td>にしているため、
スクリプトのnth-child()内で-1や+2で調整しています。
上記の条件であれば、セルが増えてもマウスオーバー時には十字方向にセルの背景色が変わるのですが、
ページ内に同じクラス名のテーブルが増えると、狂ってきます。

発生している問題・エラーメッセージ

エラーメッセージはなし

該当のソースコード

jQuery

1$(function(){ 2 3 $(".stripeTable tr").mouseover(function(){ 4 $(this).addClass("hover"); 5 }).mouseout(function(){ 6 $(this).removeClass("hover"); 7 }); 8 9 $(".stripeTable tr td").mouseover(function(){ 10 $(".stripeTable tr td:nth-child("+($(".stripeTable tbody tr td").index(this)%($(".stripeTable thead tr th").size()-1)+2)+")").addClass("hover"); 11 }).mouseout(function(){ 12 $(".stripeTable tr td:nth-child("+($(".stripeTable tbody tr td").index(this)%($(".stripeTable thead tr th").size()-1)+2)+")").removeClass("hover"); 13 }); 14 15});

html

1<table class="stripeTable"> 2<thead> 3<tr> 4<th></th> 5<th>A</th> 6<th>B</th> 7<th>C</th> 8</tr> 9</thead> 10<tbody> 11<tr> 12<th>1</th> 13<td></td> 14<td></td> 15<td></td> 16</tr> 17<tr> 18<th>2</th> 19<td></td> 20<td></td> 21<td></td> 22</tr> 23<tr> 24<th>3</th> 25<td></td> 26<td></td> 27<td></td> 28</tr> 29<tr> 30<th>4</th> 31<td></td> 32<td></td> 33<td></td> 34</tbody> 35</table>

CSS

1tr.hover td, 2td.hover { 3 background-color: lightyellow; 4}

試したこと

eachや$(this)などを使ってみたのですが、まだ習得不足のこともあり、自力では解決できませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

よく質問文が読めていないかもですが、とりあえずeachを使っての書き方です。

JavaScript

1$( ".stripeTable" ).each( function() { 2 var $_t = $( this ); 3 $_t.find("td").mouseover( function() { 4 $_t.find("td:nth-child("+($_t.find("td").index(this)%($_t.find("th").size()-1)+2)+")").addClass("hover"); 5 } ).mouseout( function() { 6 $_t.find("td:nth-child("+($_t.find("td").index(this)%($_t.find("th").size()-1)+2)+")").removeClass("hover"); 7 } ); 8} );

追記:

さっきのは元のコードを少し変更しただけでテストしていなかったのですが、いまいち挙動がおかしかったので、取り急ぎ修正しました。

JavaScript

1$( ".stripeTable" ).each( function() { 2 var $_t = $( this ); 3 $_t.find("td").mouseover( function() { 4 $_t.find("td:nth-child("+($( this ).parent().children().index(this)+1)+")").addClass("hover"); 5 } ).mouseout( function() { 6 $_t.find("td:nth-child("+($( this ).parent().children().index(this)+1)+")").removeClass("hover"); 7 } ); 8} ); 9```**動くサンプル:**[https://jsfiddle.net/eoy13q8o/](https://jsfiddle.net/eoy13q8o/) 10 11--- 12 13ちなみに`.size()`はjQuery3で削除されているので使うなら`.length`を使いましょう。 14 15.size() | jQuery API Documentation】 16[http://api.jquery.com/size/](http://api.jquery.com/size/) 17> version deprecated: 1.8, removed: 3.0

投稿2018/02/24 13:48

編集2018/02/24 14:56
kei344

総合スコア69398

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

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

退会済みユーザー

退会済みユーザー

2018/02/24 13:53

:odd :even を使うともっと短く記述できませんか?
kei344

2018/02/24 14:59

To: Kosuke_Shibuyaさん たぶん縦列にクラスhoverを付けたいのだと思うので、2列以上ある場合を考えると:odd :even を使う方法を思いつきませんでした。
HIROYUKI.I

2018/02/24 15:54

この度はお世話になります。 ご回答ありがとうございます。 提示いただいたスクリプトをコピペして試してみたのですが、 背景色の変化が見られませんでした。 しかしデモを拝見したところでは理想通りの動きになっているので、 こちらのCSS側の問題なのか今検討しています。 こちらの質問内容を少し追記しましたので、 引き続きよろしければお力お貸しください。
HIROYUKI.I

2018/02/25 03:58

返信ありがとうございます。 ご提示いただいた内容を理解しながら確認してみます。 時間がかかるかもしれませんが、解決後はまた告知いたします。
guest

0

ベストアンサー

こんにちは。

一行目の <tr> のセルは、 <th> であるという前提つきになってしまいますが、
こんな感じでも出来ました。

javascript

1$(function() { 2 3 $('.stripeTable').each(function(){ 4 var table = this; 5 var num_cols = $('th', table).size(); 6 var num_tds = $('td', table).size(); 7 8 $('td', table).each(function(i){ 9 10 $(this).on('mouseover mouseout', 11 function(e) { 12 var method = `${e.type == 'mouseover' ? 'add':'remove'}Class`; 13 $(this).parent()[method]('hover'); // 行の背景色を変更 14 for (var j=(i+1) % num_cols; j <= num_tds; j += num_cols) // 列の背景色を変更 15 $(`td:nth-of-type(${j})`, table)[method]('hover'); 16 } 17 ); 18 19 }); 20 }); 21}); 22 23

以下は、上記の検証のためのデモです。

https://jsfiddle.net/jun68ykt/nsxrtded/69/

一行目のセルも <td>である場合は、

javascript

1 var num_cols = $('th', table).size();

の部分を適宜、修正します。
以上参考になれば幸いです。


補足

ご質問のコードでも使われている、 index() を使えば、 <td>についてeach
しなくてもよくなり、以下のようになります。

https://jsfiddle.net/jun68ykt/nsxrtded/86/

投稿2018/02/24 14:40

編集2018/02/24 15:37
jun68ykt

総合スコア9058

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

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

HIROYUKI.I

2018/02/24 15:49

この度はお世話になります。 ご回答ありがとうございます。 提示いただいたスクリプトをコピペして試してみたのですが、 背景色の変化が見られませんでした。 しかしデモを拝見したところでは理想通りの動きになっているので、 こちらのCSS側の問題なのか今検討しています。 こちらの質問内容を少し追記しましたので、 引き続きよろしければお力お貸しください。
jun68ykt

2018/02/24 23:41 編集

このようなテーブルだとすると、th ではない、データセルの列数の このようなテーブルだとすると、th ではない、データセルの列数の 算出を以下のようにすればよいと思います。 var num_cols = $('th', $('tr', table).get(0)).size() - 1; // => 3 以下、追記された HTML と CSS を反映したものです。 https://jsfiddle.net/jun68ykt/nsxrtded/113/
jun68ykt

2018/02/24 16:15

または、2行目の td を数えればよいので var num_cols = $('td', $('tr', table).get(1)).size(); でもよいですね。
HIROYUKI.I

2018/02/25 03:58

返信ありがとうございます。 ご提示いただいた内容を理解しながら確認してみます。 時間がかかるかもしれませんが、解決後はまた告知いたします。
guest

0

お世話になります。
改めての返信が遅くなりまして申し訳ございません。
実は回答いただいた後に、基礎からスクリプトを学び直していたのですが、
現時点でもご回答いただいたスクリプトを完全に読み解けていないのが正直なところです。

しかし2つめにご提示いただいた内容(https://jsfiddle.net/jun68ykt/nsxrtded/113/)が、
まさに求めていたものでした。
コピペしてためしてみたところ反映されなかったのですが、
ご提示いただいているjQueryのバージョンが2.2.4であることに気付き、
バージョンを揃えたところ、複数のテーブルがあるページでもうまく反映されました。

ちなみに、こちらが提示しましたソースコードの流れでをeachを使って改良することは可能でしょうか。
$(".stripeTable tr)と$(".stripeTable tr td")についてeachで囲めばうまくいきそうなのですが、
そこで行き詰まってしまいます(そもそも考え方がダメなのかもしれまでんが)。
こちらが提示したコードはjQueryの入門書にあったものを参考にしたのですが、
掲載されているものは、あくまでもひとつのページにクラス名がついたテーブルがひとつという条件だったので、複数テーブルがある場合を探っていたところです。

いずれにしましても、現状は解決していただきましたので、感謝申し上げます。

投稿2018/03/28 08:40

編集2018/03/28 08:52
HIROYUKI.I

総合スコア7

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

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

kei344

2018/03/28 08:44 編集

もしかして内容をエディタで作ってコピー&ペースしていませんか?teratail のバグで記述内容が表示されないというものが以前有ったので、ペースト後に何文字か記入してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問