5

我想动态添加/删除表中的行。我有 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>

任何帮助表示赞赏!提前致谢!!!

4

4 回答 4

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);
}
于 2012-08-31T00:47:04.973 回答
4

使用 jquery 可以避免很多跨浏览器的麻烦。这是一个示例。

http://jsfiddle.net/piyushjain7/gKJEs/

于 2012-08-30T23:57:36.480 回答
2

Javascript 有一个名为deleteRow的非常有用的函数,如果您知道要从中删除的索引,您可以简单地输入该数字,然后它将删除该特定行(索引从 0 - tbl.rows.length 开始)。

我还发现了一个很好的例子,它在行动中使用它。不过,您可以对其进行调整以满足您的需求(尽管他使用的复选框可能比仅在每一行旁边制作一个按钮要干净得多)。我不鼓励您公然复制代码,所以如果有任何让您感到困惑的地方,请告诉我们。希望这可以帮助。

编辑:在您发现最后一行已完全填满后,我没有看到您想添加行。当我弄清楚时,我会更新我的答案。但是,其基本思想是检查<td>标签中是否有文本(也许检查标签内的文本是否不是空白或者是否有<td>标签,然后如果它不为空,则制作一个新<tr>元素,否则不要。

于 2012-08-30T23:55:43.873 回答
2

http://jsfiddle.net/9gnAx/

HTML & 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(头部):

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/

于 2012-08-31T00:32:28.340 回答