【问题标题】:Dynamically insert/remove table rows (including how to give ID's to added rows)动态插入/删除表行(包括如何为添加的行提供 ID)
【发布时间】:2015-12-20 04:47:58
【问题描述】:

我正在尝试实现如图所示的动态增长/收缩表。我知道我需要使用 insertRow() 函数,但我对如何动态地为行提供 ID 感到困惑。如果选中该复选框,我需要能够禁用结束日期输入字段(这就是需要提供 ID 的原因)。我需要能够插入行和删除行。我在编程概念方面相当有经验,但对 JavaScript 和 Web 开发一般来说是新手。如果有人能指出示例代码或解释是否有另一种有效的方法,我将不胜感激。

http://imgur.com/68t3dH2

【问题讨论】:

标签: javascript jquery html css


【解决方案1】:

一个示例 whitout id,适用于每个行控件, 就像你的截图一样(身份证只是一种方式......)

你不能有多个相同的 id,那么 假设您的操作按钮由它们各自的类名调用, “.add”和“.del”

用于删除

$(".del").on("click", function()
{
    // removing the line of element clicked
    $(this).parents("tr").remove();
});

换行

$(".add").on("click", function()
{
    var line = $(this).parents("tr"); // get the line of element clicked
    var lineOffset = line.index(); // get the offset position of this line
    // and using css selector, you can simply add line after another
    $("table tr:eq("+lineOffset+")").after(line.clone(true));
    // line.clone(true) is an example, but you can put directly your html like "<tr>.... what you want</tr>"
});

表格测试

<table>
    <tr id="a_0"><td>test0</td><td><span class="del">[X]</span><span class="add">[o]</span></td></tr>
    <tr id="a_1"><td>test1</td><td><span class="del">[X]</span><span class="add">[o]</span></td></tr>
    <tr id="a_2"><td>test2</td><td><span class="del">[X]</span><span class="add">[o]</span></td></tr>
</table>

(function() {

  $(".del").on("click", function() {
    // removing the line of element clicked
    $(this).parents("tr").remove();
  });

  $(".add").on("click", function() {
    var line = $(this).parents("tr"); // get the line of element clicked
    var lineOffset = line.index(); // get the offset position of this line
    // and using css selector, you can simply add line after another
    $("table tr:eq(" + lineOffset + ")").after(line.clone(true));
    // line.clone(true) is an example, but you can put directly your html like "<tr>.... what you want</tr>"
  });

})()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<table>
  <tr id="a_0">
    <td>test0</td>
    <td><span class="del">[X]</span><span class="add">[o]</span>
    </td>
  </tr>
  <tr id="a_1">
    <td>test1</td>
    <td><span class="del">[X]</span><span class="add">[o]</span>
    </td>
  </tr>
  <tr id="a_2">
    <td>test2</td>
    <td><span class="del">[X]</span><span class="add">[o]</span>
    </td>
  </tr>
</table>

但是,您可以在我的示例中看到,ID 以 a_* 开头 未使用(是的,这不是必要的,并且与您的情况相关) 另一种方法是使用 jquery 方法 .index() 获得点击线偏移和..删除或复制它!

注意:

如果您确实需要使用线路 ID, 好吧,你可以继续使用这样的 CSS 选择器:

$("tr[id^='a_']")

如果表清空

$(".del").on("click", function()
{
    // removing the line of element clicked
    $(this).parents("tr").remove();
    if($("table tr").length == 1) // the only one remaining is the hidden_control (if you doesn't use a external button but a row)
       $("#hidden_control").show(); // or .css("display", "block");
});

$("#hidden_control").on("click", function()
{
    $("table").append("<tr><td>...</tr>"); // add a new first line
    $(this).hide(); // and hide it directly until next reinit
});

// hidden button at top (or bottom) of table (not in the table)
<input type="button" id="hidden_control" value="Refill new data">

// or, hidden row solution (where colspan=6 depend the number of cell you have: 
<tr id='hidden_control'><td colspan='6'><button>Refill new data</button></td></tr>

   // CSS class for hidden_control
   #hidden_control
   { display: none; }

文档:

继续https://api.jquery.com/,搜索“parents”、“after”、“remove”、“append”、“html”、“index”

【讨论】:

  • 我发现这个小提琴做了类似的事情,但它会禁用 tr 上的所有输入。我怎样才能让它只禁用其中一个。 jsfiddle.net/arunpjohny/kPSbP
  • 在 javascript 的第 2 行,你有多种方法可以做到这一点,通过指定 find() : #0 你想要的输入的偏移量 find("input:text:eq(1)") , #1a 输入的正则表达式名称 find("input:text[name$='b']")
  • 嘿,完美。我将使用第二种方法。最后一件事:如何确保用户不会删除所有行?还是我应该在顶部添加一个按钮来添加一行?这绝对是满足我需求的最佳答案。编辑:更好的是有没有办法在 中添加添加按钮?我试过这样做,但是当我点击它时,它会增加更多。即使按钮在 中,有没有办法获得添加功能
  • 我添加了我正在谈论的内容的屏幕截图
  • 呵呵,这就是为什么我一次犹豫要谈论太多代码如果所有行都已删除,您可以简单地在表的顶部或末尾添加一个隐藏行,仅包含td with colspan 和 button 重新注入一个初始化行(这只是一个想法,或者只是在表格之后添加隐藏和居中的按钮,如果表格为空,谁会显示重新初始化他)给一分钟,我在我的帖子中附加一个示例
【解决方案2】:

用一个类或行包装每一行。

如果要添加:

 var form="<div> <input type='text'></div>";
 $(document).on('click', ".add", function(){
  $(form).insertAfter($(this).closest("#fields"));
 });    

删除:

$(document).on('click', ".remove", function(){
 $(this).closest('div').remove();
});

jsFiddle demo

【讨论】:

    【解决方案3】:

    您不需要 ID。复选框的 JavaScript 处理程序可以通过导航 DOM 树来定位结束日期字段。从复选框开始,向上遍历 DOM 树(例如 parent())以找到单元格(&lt;TD&gt;),然后遍历兄弟节点(next() 两次),然后向下遍历输入字段(例如 find('input'))。

    至于添加新行,可以参考这个answer的建议:

    $('#myTable tr:last').after('<tr>...</tr><tr>...</tr>');
    

    然后通过在&lt;TR&gt; 上调用remove() 来删除一行。

    【讨论】:

    • 如果你能举一个真正有帮助的例子。正如我之前提到的,我对 JavaScript 术语和语法不太熟悉。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签