JavaScriptでフォームテーブルを動的に拡張する方法
2009.03.14
error この記事は最終更新日から15年以上が経過しています。
ユーザー側から任意の複数行のデータをフォームから受け取る場合に、入力フォームのテーブルの行を、ボタンクリックで動的に追加していく処理というのは、結構使えるんじゃないかなと思います。
例えば、以下のようなテーブルがある場合。
<table border="1" cellspacing="0" cellpadding="4" id="table1">
<tr>
<th>名前</th>
<th>住所</th>
<th>TEL</th>
</tr><tr>
<td class="name"><input type="text" name="name" value="" size="10" maxlength="20" /></td>
<td class="address"><input type="text" name="address" value="" size="10" maxlength="20" /></td>
<td class="tel"><input type="text" name="tel" value="" size="10" maxlength="20" /></td>
</tr>
</table>
「insertRow」や「insertCell」を使って、「table1」という ID を持つテーブルに、行を追加します。
var table1 = document.getElementById("table1");
var row1 = table1.insertRow(1); // 行を追加
var cell1 = row1.insertCell(0); // 一つ目のセルを追加
var cell2 = row1.insertCell(1); // 二つ目のセルを追加
var cell3 = row1.insertCell(2); // 三つ目のセルを追加
「insertRow」「insertCell」の各引数は、何番目の行・セルを追加するかを指定します。
IEでは引数なしでも動きますが、FireFoxでは引数が必須なので注意。
で、最初のサンプルでは各セルに class を指定していたわけですが、追加したセルに class を指定するには、「setAttribute」「className」等を使います。
cell1.setAttribute("class","name");
cell2.setAttribute("class","address");
cell3.setAttribute("class","tel");
cell1.className = 'name';
cell2.className = 'address';
cell3.className = 'tel';
また、セルの中身である input 要素等を入れるのには、「innerHTML」を使います。
var HTML1 = '<input type="text" name="name" value="" size="10" maxlength="20" />';
var HTML2 = '<input type="text" name="address" value="" size="10" maxlength="20" />';
var HTML3 = '<input type="text" name="tel" value="" size="10" maxlength="20" />';
cell1.innerHTML = HTML1;
cell2.innerHTML = HTML2;
cell3.innerHTML = HTML3;
ただ、これだとボタンをクリックされる毎に追加される input 要素の name 属性が、全て「name」「address」「tel」になってしまうので、別途カウンタを回して「name1」「name2」......みたいな感じになるようにした方が良いでしょう。
この辺の事も踏まえたうえでのサンプルコードは以下。
<script type="text/javascript">
var counter = 0;
function AddTableRows(){
// カウンタを回す
counter++;
var table1 = document.getElementById("table1");
var row1 = table1.insertRow(counter);
var cell1 = row1.insertCell(0);
var cell2 = row1.insertCell(1);
var cell3 = row1.insertCell(2);
// class の付与は UserAgent によって
// 挙動が違うっぽいので念のため両方の方法で
cell1.setAttribute("class","name");
cell2.setAttribute("class","address");
cell3.setAttribute("class","tel");
cell1.className = 'name';
cell2.className = 'address';
cell3.className = 'tel';
var HTML1 = '<input type="text" name="name' + counter + '" value="" size="10" maxlength="20" />';
var HTML2 = '<input type="text" name="address' + counter + '" value="" size="10" maxlength="20" />';
var HTML3 = '<input type="text" name="tel' + counter + '" value="" size="10" maxlength="20" />';
cell1.innerHTML = HTML1;
cell2.innerHTML = HTML2;
cell3.innerHTML = HTML3;
}
</script>
<table border="1" cellspacing="0" cellpadding="4" id="table1">
<tr>
<th>名前</th>
<th>住所</th>
<th>TEL</th>
</tr><tr>
<td class="name"><input type="text" name="name0" value="" size="10" maxlength="20" /></td>
<td class="address"><input type="text" name="address0" value="" size="10" maxlength="20" /></td>
<td class="tel"><input type="text" name="tel0" value="" size="10" maxlength="20" /></td>
</tr>
</table>
<form method="GET" action="#">
<input type="button" value="テーブルに行を追加" onClick="AddTableRows();" />
</form>
実際の挙動
名前 | 住所 | TEL |
---|---|---|
ボタンクリックでテーブルに行が追加されるはずです(ちゃんと動くかな)。
各行の input 要素の name 属性も、「name1」「name2」......となっていくはず。
ダッシュボードのパフォーマンス改善:Ajaxとiframeの実践例
2024.12.11
サーバーサイドですべてを処理してから画面を出力するのではなく、データを分割して効率的に表示する手法をご紹介。Ajaxとiframe、それぞれの特徴や実装例をわかりやすく解説します。
contenteditableで作るインライン編集システムとデータ送信の仕組み
2024.12.03
contenteditable属性を利用すれば、HTML内のテキストを直接編集できるインターフェースを構築できます。 本記事では、contenteditableを活用したインライン編集機能の実装手法について解説します。 UIの向上を目指す際の参考として。
セレクトボックスでデータ更新を実現する仕組みと実装例
2024.11.29
「チェックボックスを使ったデータ更新の仕組み」に続く記事として、今回はセレクトボックスを活用したデータ更新の方法をご紹介します。複数の選択肢から値を選び、それをサーバー側に送信して更新する仕組みを、実装例とともに解説します。
チェックボックスでデータ更新を実現する仕組みと実装例
2024.11.27
一覧画面のチェックボックスを用いて、データの状態を即時に更新する仕組みを実装する方法を解説します。HTMLの構造設計からJavaScriptの連携処理、サーバーサイドでの対応まで、説明しています。