【问题标题】:Dynamic Table Rows + Chained Select动态表行 + 链式选择
【发布时间】:2013-12-31 15:01:34
【问题描述】:

我需要能够动态添加和删除不定数量的表行。我还需要能够在这些表行中链接选择框。我得到了预期的结果(这是错误的),但我不是 Javascript 爱好者,我不知道自己在做什么。

我正在使用chained.js script from Mika Tuupola 和几乎可以在任何地方找到的“动态表”脚本。

<table id="table">
<tr><td><input id="dept" name="dept[]" /></td>
    <td><input id="service" name="service[]" /></td>
    <td><input id="reason" name="reason[]" /></td>
</tr>
</table>

<script language="javascript">
     $("#service").chained("#dept");
     $("#reason").chained("#dept");

     function addRow(table) {
          var row = $('#table tbody>tr:last').clone(false);
          row.insertAfter('#table tbody>tr:last');
     }

     function delRow(el) {

          while (el.parentNode && el.tagName.toLowerCase() != 'tr') {
               el = el.parentNode;
      }

          if (el.parentNode && el.parentNode.rows.length > 2) {
               el.parentNode.removeChild(el);
          }
     }
</script>

希望这足以说明问题。

很明显,因为链式选择是基于 ID 的。在第一个下拉菜单中进行选择后,“子”下拉菜单将链接到第一个下拉菜单。

我怀疑我需要以某种方式修改每个选择框的 ID,然后在链接分配中增加 ID。但我也怀疑可能有一种更简单的方法可以做到这一点,或者它需要某种委托,因为我可能需要在添加表格行后销毁并重新分配链......?

我不知道。任何指向正确方向的指针将不胜感激。

更新

我做了一个小提琴。它仅适用于 Chrome。框架/扩展的某些组合在其他浏览器中工作和部分工作。但是我唯一可以让这个例子工作的是 Chrome。抱歉,我没有很多 JSFiddle 练习。

http://jsfiddle.net/J2Vef/11/

请注意,如果您从第一个下拉列表中选择一个选项,然后添加一行,会发生什么情况。添加行的第二个下拉列表中的所有选项将是第一行中第一个下拉列表的选项。

如果您添加一行然后开始尝试选择选项,那么无论您在第一个下拉菜单中放置什么,第二个下拉菜单都不会激活。

【问题讨论】:

  • 这是一篇关于这个主题的帖子,可能会有所帮助 --- chaining select using jquery.chained.min.js does not work
  • 链式选择本身可以正常工作。当我开始添加行时,我开始遇到问题。添加了一个小提琴来演示这个问题。我为小提琴的随意构造道歉。此外,如果您在 Javascript 中将 clone(false) 更改为 clone(true),则第一个下拉列表中的选项仅更改第一行中第二个下拉列表的选项,无论您添加多少行,只要您我先在第一行选择了一些东西。我认为这完全表明我对 Javascript 缺乏了解。

标签: jquery select dynamic html-table chained


【解决方案1】:

试试这样的东西。您遇到的问题是您只能拥有一个具有一个 id 的元素。在您提供的示例中,您正在克隆表格行元素,但没有更改选择的 id 名称。此外,您还需要通过新 id 将新选择链接在一起。

这里是jsFiddle

我确信它们可能是编写此代码块的一种更简洁的方式,但它会帮助您重新开始。

 var row = $('#tableID tbody:first').html();
 $("#series").chained("#mark");

 function addRow(tableID) {
      $(row).appendTo('#tableID');
      var rowCnt = $('#tableID tbody>tr').length;

     $('#tableID tbody>tr:last select:first').attr('id','mark'+rowCnt);
     $('#tableID tbody>tr:last select:last').attr('id','series'+rowCnt);

    $('#series'+rowCnt).chained("#mark"+rowCnt);
  }

【讨论】:

  • 我没有足够的代表来支持这个答案。只要添加的选择框没有被锁定,它就会有所帮助。我可以很好地选择它们。但它不会将它们与初始选择链接起来。这可能是也可能不是我的实施中的缺陷。但我不知道该链是否适用于文档加载,或者在事后调用时它是否仍然有效。可能是这个脚本做不到。
  • 这里是jsFiddle,应该有助于看到这一点
  • 你的小提琴有效,所以这显然是我做错了。感谢您的帮助。
  • 实际上有第三个下拉菜单,这可能会导致问题。但我认为你给了我一个良好的开端。
猜你喜欢
  • 2018-07-06
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2019-12-22
  • 1970-01-01
相关资源
最近更新 更多