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

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

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

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

Q&A

解決済

2回答

800閲覧

クリックした列が消えるように特定の列を取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

jQuery

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

0グッド

0クリップ

投稿2020/11/24 12:18

前提・実現したいこと

<thead>の<th>内に閉じるボタンを設置し、そのボタンをクリックすることで クリックされた列が削除されるようになってほしい。 例えば、1列目の閉じるボタンを押して削除した後に、 4列目の閉じるボタンを押して削除できるように、 同じ動作を繰り返し別の列もできるようになってほしい。

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

該当の列を複数取得すことはできたのですが、
該当の列のindexを取得するやり方がわかりません。

該当のソースコード

html

1<div><!--チェックボックス--> 2 <ul> 3  <li> 4   <label for="item-1"><input type="checkbox" value="1" id="item-1">アイテム1</label> 5  </li> 6  <li> 7   <label for="item-2"><input type="checkbox" value="2" id="item-2">アイテム2</label> 8  </li> 9 </ul> 10</div> 11 12<div><!--ボタン--> 13 <button class="execution">実行</button> 14 <button class="reset">リセット</button> 15</div> 16 17<table> 18 <thead> 19 <tr> 20 <td></td> 21 <th data-selection="1"> 22    <div><p class="clm_close">×</p>アイテム1-1</div> 23 </th> 24 <th data-selection="1"> 25    <div><p class="clm_close">×</p>アイテム1-2</div> 26 </th> 27 <th data-selection="2"> 28    <div><p class="clm_close">×</p>アイテム2-1</div> 29 </th> 30 </tr> 31 </thead> 32 <tbody> 33 <tr> 34 <th>テキストA</th> 35 <td>テキストA-1</td> 36 <td>テキストA-2</td> 37 <td>テキストA-3</td> 38 </tr> 39 <tr> 40 <th>テキストB</th> 41 <td>テキストB-1</td> 42 <td>テキストB-2</td> 43 <td>テキストB-3</td> 44 </tr> 45 </tbody> 46</table>

css

1.hide{ 2 display: none; 3} 4table thead th div{ 5 position: relative; 6} 7table thead th div .clm_close{ 8 position: absolute; 9 top: 1px;left: 1px; 10}

jquery

1$(function() { 2 // 実行ボタンを押すとチェックされていない該当列は消える 3 $('.execution').click(function() { 4 let values = [], 5 col_index = []; 6 7 $('[type="checkbox"]:not(:checked)').each(function(){ 8 values.push(parseInt($(this).val())); 9 }); 10 11 if (values) { 12 $('thead tr').children().each(function(index, element){ 13 if ($.inArray($(element).data('selection'), values) != -1) { 14 col_index.push(index); 15 } 16 }); 17 18 $.each(col_index, function(index, value){ 19 $('tr').each(function(){ 20 $(this).children().eq(value).addClass('hide'); 21 }); 22 }); 23 } 24 }); 25}); 26 27 28$(function() { 29 // 実行ボタンを押すとチェックされた該当列は残る 30 $('.execution').click(function() { 31 let values_1 = []; 32 let col_index_1 = []; 33 34 $('[type="checkbox"]:checked').each(function(){ 35 values_1 .push(parseInt($(this).val())); 36 }); 37 38 if (values_1 ) { 39 $('thead tr').children().each(function(index, element){ 40 if ($.inArray($(element).data('selection'), values_1 ) != -1) { 41 col_index_1.push(index); 42 } 43 }); 44 45 $.each(col_index_1, function(index, value){ 46 $('tr').each(function(){ 47 $(this).children().eq(value).removeClass('hide'); 48 }); 49 }); 50 } 51 }); 52}); 53 54//両方チェックすると全て表示 55$(function() { 56 $('.execution').click(function() { 57 if ($('[value="1"]').prop('checked') && $('[value="2"]').prop('checked')) { 58 $('.hide').removeClass('hide'); 59 }; 60 }) 61}); 62 63 64//リセットボタンを押すと全て表示 65$('.reset').click(function() { 66 $('.hide').removeClass('hide'); 67 $('[type="checkbox"]').prop('checked', false); 68}); 69

試したこと

jquery

1$(function() { 2 $('.clm_close').click(function() { 3 //.clm_closeをクリックしたセルの<th>に.hideクラスを追加して消す 4 $(this).parents('th').addClass('hide'); 5 6 let values_2 = []; 7 let col_index_2 = []; 8 9 //①.hideクラスがついたセルの値を取得(したつもり) 10 $('.hide').each(function(){ 11 values_2.push($(this)); 12 }); 13 14 //②.hideクラスがついた該当する列のindexを取得したい 15 if (values_2) { 16 $('thead tr').children().each(function(index, element){ 17 if ($.inArray($(element).data('selection'), values_2) != -1) { 18 col_index_2.push(index); 19 } 20 }); 21 22 // 全ての行について、該当列にhideクラスを追加 23 $.each(col_index_2, function(index, value){ 24 $('tr').each(function(){ 25 $(this).children().eq(value).addClass('hide'); 26 }); 27 }); 28 } 29 }); 30});

②のcol_index_2で該当する列のindexを取得したかったのですが、
console.logで見ても何も取得されていませんでした。
①の時点で間違えているのか、最初から間違えているのか、わからなくなってしまいました。

ご教授のほどよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

②のcol_index_2で該当する列のindexを取得したかったのですが

$.inArray($(element).data('selection'), values_2)してますよね。

例えば、右端の「アイテム2-1」の閉じるボタンをクリックしたら、
values_2配列には、何が入っててほしいですか?

'2'ですよね?

だとすると、①のところでは、values_2.push($(this))ではなく、
values_2.push($(this).data('selection'))とすべきですね。


余談ですが、thdata-selection属性には一意な値をセットする作戦だと思ったのですが、違います? 現状は、左から1, 1, 2となってるので、マズイんじゃないかなぁ。

あと、②のところにif (values_2) {がありますが、values_2は配列なので、if (values_2.length > 0) {の方が意図に沿ってるのではないかと思いました。

投稿2020/11/24 13:48

gpsoft

総合スコア1323

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

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

退会済みユーザー

退会済みユーザー

2020/11/26 08:08

回答ありがとうございます。 まずdata-selection属性を2種類にしているのは、 value="1"のチェックボックスにチェックを入れて実行ボタンを押すとdata-selection="1"の列が、 value="2"のチェックボックスにチェックを入れて実行ボタンを押すとdata-selection="2"の列が残るようになってほしいためです。 確かにjqueryを直してみたところ、data-selection属性を一意にしていないため閉じるボタンを押した場合、共通のdata-selection属性ごと消えてしまいました。 ($.inArray($(element).data('selection')…)の考え方がまず間違えていました。 ご指摘ありがとうございました。
guest

0

ベストアンサー

その場合は.index()で取得できます。
コードも以下のようにもっと単純にできます。

jQuery

1$('.clm_close').click(function() { 2 let th = $(this).closest('th'), 3 index = $('thead tr th').index(th); 4 5 th.addClass('hide'); 6 7 $('tbody tr').each(function(){ 8 $(this).children('td').eq(index).addClass('hide'); 9 }); 10});

ただしhtml構造が、提示されているようにthead, tbodyとも1列目と2列目以降で違っている前提で上記は期待通りに動作します。仮にthead内が全てth、且つtbody内は1列目だけthで2列目以降がtdという場合は別の対応が必要です。

あと、本題とは関係ありませんが、$(function() {...}が繰り返し書かれていますが、一つの$(function() {...}の中に全部まとめることが可能です。その方がコードがすっきりしますよ。

投稿2020/11/24 13:47

編集2020/11/24 13:53
cerfweb

総合スコア1907

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

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

退会済みユーザー

退会済みユーザー

2020/11/26 08:09

回答ありがとうございます。 想定していた動きを出せるようにできました。 $(function() {...}もまとめてみました。 精進します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問