我想动态地在表中添加/删除行。我有javascript函数来添加和删除行。但是,我想在每一行旁边的删除按钮,以便我可以删除特定的行。
我想只在第一行完全填满时添加一行。
删除行的功能
function removeRowFromTable()
{
var tbl = document.getElementById('tblSample');
var lastRow = tbl.rows.length;
if (lastRow > 2) tbl.deleteRow(lastRow - 1);
}
添加行的功能:
function addRow(tableID) {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;
var row = table.insertRow(rowCount);
var cell1 = row.insertCell(0);
var element1 = document.createElement("input");
element1.type = "text";
cell1.appendChild(element1);
var cell2 = row.insertCell(1);
var element2 = document.createElement("input");
element2.type = "text";
cell2.appendChild(element2);
}
我的桌子:
<table id="tableId">
<tr><td>Host Name</td><td>Directory</td></tr>
<tr><td><input type="text"/></td><td><input type="text"/></td></tr>
<tr><td><input type="button" value="+" onclick="addRow(tableId)"/></td>
<td><input type="button" value="-" onclick="removeRowFromTable()"/></td></tr>
</table>
任何帮助表示赞赏!在此先感谢!!!
答案 0 :(得分:7)
如果在每行上放置删除按钮,则:
<tr>
<td><input type="button" value="Delete row" onclick="deleteRow(this)">
<td><input type="text">
<td><input type="text">
</tr>
deleteRow函数可以是:
function deleteRow(el) {
// while there are parents, keep going until reach TR
while (el.parentNode && el.tagName.toLowerCase() != 'tr') {
el = el.parentNode;
}
// If el has a parentNode it must be a TR, so delete it
// Don't delte if only 3 rows left in table
if (el.parentNode && el.parentNode.rows.length > 3) {
el.parentNode.removeChild(el);
}
}
顺便说一句,如果您的所有行都具有相同的内容,则通过克隆现有行来添加行会快得多:
function addRow(tableID) {
var table = document.getElementById(tableID);
if (!table) return;
var newRow = table.rows[1].cloneNode(true);
// Now get the inputs and modify their names
var inputs = newRow.getElementsByTagName('input');
for (var i=0, iLen=inputs.length; i<iLen; i++) {
// Update inputs[i]
}
// Add the new row to the tBody (required for IE)
var tBody = table.tBodies[0];
tBody.insertBefore(newRow, tBody.lastChild);
}
答案 1 :(得分:4)
使用jquery可以避免许多跨浏览器的麻烦。这是一个样本。
答案 2 :(得分:2)
Javascript有一个非常有用的函数deleteRow,如果你知道你要删除的索引,你可以简单地输入那个数字,然后它将删除那个特定的行(索引从0开始 - tbl。 rows.length)。
我还找到了一个很好的example,它在行动中使用它。你可以调整它以适应你的需要(尽管他使用的复选框可能比在每一行旁边制作一个按钮更清晰)。我不鼓励你公然复制代码,所以如果有什么让你感到困惑,请告诉我们。希望这会有所帮助。
编辑:在您发现最后一行完全填满后,我没有看到您想要添加行。当我想出来时,我会更新我的答案。但是,基本的想法是检查<td>
标记中是否包含文本(也许检查标记内的文本是否为空白或者是否有<td>
标记然后,如果它不为空,则创建一个新的<tr>
元素,否则不会。
答案 3 :(得分:2)
HTML&amp; JavaScript(正文):
<table id="tableId">
<tr>
<th>Host Name</th>
<th>Directory</th>
<td><input class="add" type="button" value="+" /></td>
</tr>
<tr>
<td></td><td></td>
<td><input class="add" type="button" value="+" /></td>
</tr>
</table>
<script type="text/javascript">
(function(){
var els=getElementsByClassName("add","tableId");
for(var i=0;i<els.length;i++){
els[i].onclick=addRow;
}
els[0].onclick();
})();
</script>
CSS(负责人):
.add,.del{
width:25px;
}
JavaScript(head):
function getElementsByClassName(c,el){
if(typeof el=='string'){el=document.getElementById(el);}
if(!el){el=document;}
if(el.getElementsByClassName){return el.getElementsByClassName(c);}
var arr=[],
allEls=el.getElementsByTagName('*');
for(var i=0;i<allEls.length;i++){
if(allEls[i].className.split(' ').indexOf(c)>-1){arr.push(allEls[i])}
}
return arr;
}
function killMe(el){
return el.parentNode.removeChild(el);
}
function getParentByTagName(el,tag){
tag=tag.toLowerCase();
while(el.nodeName.toLowerCase()!=tag){
el=el.parentNode;
}
return el;
}
function delRow(){
killMe(getParentByTagName(this,'tr'));
}
function addRow() {
var table = getParentByTagName(this,'table')
var lastInputs=table.rows.length>2?
table.rows[table.rows.length-2].getElementsByTagName('input'):[];
for(var i=0;i<lastInputs.length-1;i++){
if(lastInputs[i].value==''){return false;}
}
var rowCount = table.rows.length;
var row = table.insertRow(rowCount-1);
var cell1 = row.insertCell(0);
var element1 = document.createElement("input");
element1.type = "text";
cell1.appendChild(element1);
var cell2 = row.insertCell(1);
var element2 = document.createElement("input");
element2.type = "text";
cell2.appendChild(element2);
var cell3 = row.insertCell(2);
var element3 = document.createElement("input");
element3.type = "button";
element3.className="del";
element3.value='-';
element3.onclick=delRow;
cell3.appendChild(element3);
}
<强>更新强>
RobG让我意识到如果没有getParentByTagName
传递的父级,nodeName
会抛出错误。
如果你想要一个更通用的getParentByTagName
,它不会抛出错误,你可以使用
function getParentByTagName(el,tag){
tag=tag.toLowerCase();
while(el&&el.nodeName.toLowerCase()!=tag){
el=el.parentNode;
}
return el||null;
}
当您调用该函数时,您应该检查结果是否为null
。
更新了jsfiddle:http://jsfiddle.net/9gnAx/1/