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」......となっていくはず。
セレクトボックスでデータ更新を実現する仕組みと実装例
2024.11.29
「チェックボックスを使ったデータ更新の仕組み」に続く記事として、今回はセレクトボックスを活用したデータ更新の方法をご紹介します。複数の選択肢から値を選び、それをサーバー側に送信して更新する仕組みを、実装例とともに解説します。
チェックボックスでデータ更新を実現する仕組みと実装例
2024.11.27
一覧画面のチェックボックスを用いて、データの状態を即時に更新する仕組みを実装する方法を解説します。HTMLの構造設計からJavaScriptの連携処理、サーバーサイドでの対応まで、説明しています。
datalistとJavaScriptで作るタグ入力フォームの実装ガイド
2024.11.17
ブログやアプリケーションで便利な「タグ入力フォーム」。この記事では、datalist要素を利用して、既存タグの選択と新規タグの追加を同時に実現するUIの作成方法をご紹介します。さらに、JavaScriptとCSSを活用して、複数選択対応やタグ削除機能、Enterキーでのタグ追加機能も実装。タグ入力フォームを効率的かつユーザーフレンドリーにカスタマイズする方法を詳しく解説します。
ページリロードボタンを作成するシンプルな方法
2023.05.25
リロード機能を持つボタンを追加したい時に便利な、location.reload() を利用した実装方法を解説します。初心者にもわかりやすいコード例付きです。