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

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

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

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

jQuery

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

Q&A

解決済

1回答

1151閲覧

動的にtableを追加、削除

kinisinai

総合スコア28

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/10/09 12:50

jQuery

1function addRow(idx){ 2 var tags; 3 tags += "<tr> <td class=text-center> <button type=button class='btn deleterowbtn'>削除</button></td>"; 4 tags += "<td class='text-center'><input name='hoge_name" + idx + "' id='hoge" + idx + "' type=checkbox></td>"; 5 tags += "<td><input name='hoge2" + idx + "' id='hoge2" + idx + "' class=form-control type=text></td>"; 6 tags += "<td><input name='hoge3" + idx + "' id='hge3" + idx + "' class=form-control type=text></td></tr>"; 7 $('#hoge_table tbody').append(tags); 8}; 9$("#hoge_add").click(function(){ 10 // テーブルの行取得 11 var idx = $("#hoge_table > tbody > tr").length; 12 addRow(idx + 1); 13}); 14// 追加した行を削除 15$(document).on("click",".deleterowbtn", function(){ 16 var row = $(this).closest("tr").remove(); 17 $(row).remove(); 18});

現在このようなコードで動的にテーブルの行を追加するコードを記述しているのですがこれで削除するとIDの部分が行を削除したときにIDの数字にズレが出てしまいます。
うまく説明できないのですが追加ボタンを3回クリックすると3行新しく作成されます。このときIDに割り振っている数字は上から1,2,3になるかと思います。
この状態で真ん中の行を削除すると上からIDに割り振っているIDは1,3となってしまいます。この時に削除したタイミングで1,2となるように変更したいです。
どのように変更するば良いかご教授いただければ幸いです。

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

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

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

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

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

jun68ykt

2019/10/09 14:10

各 input の name の値の末尾も、id の変更に合わせて変更するのでしょうか?
kinisinai

2019/10/09 14:12

できればnameの値の末尾も変更したいです。
miyabi_takatsuk

2019/10/09 14:13

idとnameは変えない方がいいような・・・。 まぁ、変える必要があるのなら別ですが(通常よっぽどの理由がない限り変えるようなものではない)
jun68ykt

2019/10/09 15:52

@obake_ さん > できればnameの値の末尾も変更 するコードを回答しました。参考になれば幸いです。
kinisinai

2019/10/09 21:38

@jun68yktさん とても丁寧な解説ありがとうございます。
guest

回答1

0

ベストアンサー

こんにちは

修正の方針や方法が、色々ありそうですが、以下その一例として回答します。

まず、あるjQueryオブジェクトに対する操作として、当該要素の内側にある <input>name属性 と id 属性を、 与えられた引数 idx から得られる規則的な値に上書きするプラグインを作成します。

javascript

1$.fn.setInputsAttrs = function(idx) { 2 $('input', this).each(function(i, e) { 3 const value = `hoge${i > 0 ? i+1 : ''}${idx}`; 4 $(e).attr({ 5 name: value, 6 id: value 7 }); 8 }); 9}

これによって、 ある <tr> を参照する e があったときに、例えば

javascript

1$(e).setInputsAttrs(5);

とすると、この<tr> の中に出現する最初 <input>name属性 と id 属性の値は、 hoge5 になり、2番目の<input> については hoge25、3番目の<input> については hoge35 になります。

次に、上記のプラグインを使うために、 addRow を以下のように修正します。

javascript

1function addRow(idx) { 2 var tags = "<tr><td class='text-center'><button type='button' class='btn deleterowbtn'>削除</button></td>" + 3 "<td class='text-center'><input type='checkbox' /></td>" + 4 "<td><input class='form-control' type='text' /></td>" + 5 "<td><input class='form-control' type='text' /></td></tr>"; 6 7 var row = $(tags); 8 $('#hoge_table tbody').append(row); 9 10 return row; 11};

上記のように、 addRow の中では、各<input>idname は設定せずに、先の setIdAndName でそれらの設定を行うようにするため、追加した行のjQueryオブジェクトを返すようにします。

これまでの追加、修正によって、追加ボタンがクリックされたときの処理は以下のように書けます。

javascript

1$("#hoge_add").click(function() { 2 var rowsCount = $("#hoge_table > tbody > tr").length; 3 addRow().setInputsAttrs(rowsCount + 1); 4});

最後に削除時の修正です。ある行が削除されたとき、その行より後にある行について、idname を更新します。

javascript

1$(document).on("click", ".deleterowbtn", function() { 2 var row = $(this).closest("tr").remove(); 3 var removedIndex = $('tr').index(row); 4 5 $(row).remove(); 6 7 $('tr').each(function(i, e) { 8 if (i >= removedIndex) $(e).setInputsAttrs(i + 1); 9 }); 10});

上記のように、remove する前に、削除される行のインデクスを取っておき、削除した後に、そのインデクスの行も含めた以降の行について、setInputsAttrs を実行します。

以下は、上記の修正後のコードの動作確認用に CodePen に上げたものです。

以上、参考になれば幸いです。

投稿2019/10/09 15:50

編集2019/10/09 16:11
jun68ykt

総合スコア9058

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問