在 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);
select
可以在任何现代浏览器上使用 CSS 选择器和document.querySelector
(获取第一个匹配项)或(获取所有匹配项的列表)来获取对现有项的引用document.querySelectorAll
,例如:
var list = document.querySelectorAll('select[name="hdd"]');
var existingSelect = list[list.length - 1]; // Get the last one
...这会给你最后一个。或者更有可能的是,您有一行包含您想要复制的内容(atr
或 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 方面,最好不要有 , 等列hdd1
,hdd2
因为它会使对这些字段的查询变得复杂,并且当然会限制您可以拥有的最大数量(当然,您可能想要限制反正)。(将这些列放在一行中称为“非规范化”数据库。)
在 DB 设计中执行此操作的常用方法是创建第二个表,列出 HDD,其中第二个表中的键(“外键”)链接回您的主表。(有关更多信息,请参阅“数据库规范化”。)
所以你的主表可能有一个记录ID,比如说SystemID
。然后,您的 HDDs 表将有一个SystemID
列和一个HDD
列,其中它可以有许多相同的行SystemID
。
这是表单位的完整示例:Live Copy | 直播源
<!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>
一些有用的参考: