JavaScript でフィールドを複製するのは簡単です。あなたが持っているとしましょう:
<select name="hdd"><!-- ...options here...--></select>
次に、DOM 内の既存の要素への参照を取得したら (以下を参照)、これを行うことができます。
var newSelect = existingSelect.cloneNode(true);
newSelect.selectedIndex = -1; // To clear any existing selection
existingSelect.parentNode.insertBefore(newSelect, existingSelect.nextSibling);
CSS セレクターを使用して(最初の一致を取得するため) または(すべての一致のリストを取得するため) を使用して、最新のブラウザーで既存の参照を取得select
できます。たとえば、次のようになります。document.querySelector
document.querySelectorAll
var list = document.querySelectorAll('select[name="hdd"]');
var existingSelect = list[list.length - 1]; // Get the last one
...これで最後の 1 つが得られます。または、コピーしたいものを含む何らかの行 ( a tr
、または a div
)がある可能性が高いです。問題ありません。その行にクラスを指定し (たとえば、)、全体を複製します (ここでは、最後の行を複製し、最後に追加しています)。"hdd"
var list = document.querySelectorAll('.hdd');
var existingRow = list[list.length - 1]; // Get the last one
var newRow = existingRow.cloneNode(true); // Clone it
newRow.querySelector('select[name="hdd"]').selectedIndex = -1; // Clear selected value
existingRow.parentNode.insertBefore(newRow, existingRow.nextSibling);
MySQL 側では、 、 などの列を持たないことが最善です。これらのフィールドに対するクエリが複雑になり、もちろん、使用できる最大数が制限されるためです (もちろん、おそらくそれを制限したいでしょう)。とりあえず)。(これらの列を 1 つの行に配置することを、DB の「非正規化」と呼びます。)hdd1
hdd2
DB 設計でこれを行う通常の方法は、HDD をリストする 2 番目のテーブルを用意し、その 2 番目のテーブルのキー (「外部キー」) をメイン テーブルにリンクすることです。(詳細については、「データベースの正規化」を参照してください。)
したがって、メイン テーブルには、たとえばSystemID
. HDDs テーブルにはSystemID
列とHDD
列があり、同じSystemID
.
フォーム ビットの完全な例を次に示します。ライブソース
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Add Form Field Example</title>
</head>
<body>
<div class="hdd">
<label>HDD: <select name="hdd">
<option>--choose--</option>
<option>80GB</option>
<option>500GB</option>
<option>1TB</option>
<option>2TB</option>
</select></label></div>
<input type="button" id="theButton" value="Add Row">
<script>
(function() {
document.getElementById("theButton").addEventListener("click", addRow, false);
function addRow() {
var list = document.querySelectorAll('.hdd');
var existingRow = list[list.length - 1]; // Get the last one
var newRow = existingRow.cloneNode(true); // Clone it
newRow.querySelector('select[name="hdd"]').selectedIndex = -1; // Clear selected value
existingRow.parentNode.insertBefore(newRow, existingRow.nextSibling);
}
})();
</script>
</body>
</html>
参考文献: