【问题标题】:jQuery datatables delete rows but only the ones which are dynamically addedjQuery 数据表删除行,但只删除动态添加的行
【发布时间】:2014-11-19 14:12:25
【问题描述】:

我关注了这篇文章(http://sebastiandahlgren.se/2013/07/27/adding-lines-to-table-with-jquery/),并在我的 jsp 页面中实现了添加行和删除行功能。

除一个问题外,一切正常。删除行按钮还会删除在页面加载期间加载的行(比如 30 行)。

这里是代码sn-p

 function deleteRow () {
    if (count != 1) {
        $("table#myTable").dataTable().fnDeleteRow(count - 1);

        count--;
    }
  }

我只想允许那些使用数据表插件的 addrow 函数动态添加的行。如何解决这个问题。

【问题讨论】:

  • 你能用相关代码创建一个JSFiddle吗?

标签: jquery datatables jquery-datatables


【解决方案1】:

您需要区分预加载的行和在 js 代码中动态添加的行。一种可能的解决方案是仅将自定义 css 类添加到动态添加的行中:

function addRow() {
    var table = $('table#myTable').dataTable();
    table.fnAddData( [
          '<input type="text" name="first_name_' + count + '">',
          '<input type="text" name="last_name_' + count + '">' ] );
    $(table._('tr')[count]).addClass('dynamicRow'); // add the dynamic css class

    count++;
 }

然后在删除行方法中,检查行 css 类是否包含我们的动态类。如果是这样,请删除该行,否则什么也不做。示例如下:

function deleteRow () {
  if (count != 1) {
      var table = $("table#myTable").dataTable();
      if ($(table._('tr')[count - 1]).hasClass('dynamicRow')) {
          table.fnDeleteRow(count - 1);

          count--;
      }
   }
}

【讨论】:

  • 很抱歉,但这永远不会起作用并且会在控制台中产生错误。您正在 dataTable() 实例上混合 1.10.x API 和 1.9.x API 方法。
  • 一点也不抱歉——错误就是错误。实际上,我很高兴您指出了这一点,我认为当前的代码在 1.9 中应该没问题。谢谢
  • 好答案!误读了这篇文章并得到了它针对 1.10.x 的印象,所以发布了另一个答案,它仅适用于 1.10.x。但是您更新的答案对于 1.9.4 是正确的。
  • 两个答案都很聪明。
【解决方案2】:

编辑:我看错了文章,其实是用1.9.4的!但无论如何 - 如果你想升级,我会建议,这里是重写文章中的代码以利用强大的 1.10.x API。正如@IvayloSlavov 建议的那样,您可以向插入的行添加一个类。我会向该行添加一个属性,例如&lt;tr dynamic="true" ...&gt;&lt;/tr&gt;。使用新 API 的另一个好处是,数据表控件(如分页)会在过程中更新(除了你摆脱了不那么聪明的 count 变量:)。

var row,
    table;

$(document).ready(function() {
    table = $('table#myTable').DataTable({
        filter: false,
        info: false,
        paginate: false,
        order: []
    });
    // Add initial row
    addRow();
});

function addRow() {
    row = table.row.add([
        '<input type="text" name="first_name_' + table.rows().data().length + '">',
        '<input type="text" name="last_name_' + table.rows().data().length + '">'
    ]).draw().node();
    $(row).attr('dynamic', true);
}

function deleteRow() {
    row = table.row(table.rows().data().length-1).node();
    if ($(row).is('[dynamic]')) {
        table.row(row).remove().draw();
    }
}

查看演示 -> http://jsfiddle.net/9rLv0uob/

【讨论】:

  • 这个 js 小提琴有效,但我得到一个 table.row 为空或控制台上的对象错误。我已经导入了以下js
  • 不错的选择,使用属性。我建议使用 data- 属性,例如 data-dynamic=true 等,因为自定义属性可能不被视为有效的 html。
  • @AbhishekSingh,已更新小提琴 -> jsfiddle.net/9rLv0uob 现在使用 1.10.2 并具有一些初始静态行(正如您所说,页面加载时可以有 30 行)。我不知道为什么,但出于某种原因,table.rows().length 是 1.10.x 中的“功能”,正确用法是 table.rows().data().length,所以将其更新为使用它。
  • @IvayloSlavov,你是绝对正确的——真正的 html5 兼容(在 validator.w3.org 中验证)自定义属性应该是 data-xxx
猜你喜欢
  • 2020-10-02
  • 2016-02-07
  • 2013-04-25
  • 1970-01-01
  • 2015-09-26
  • 2017-04-05
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
相关资源
最近更新 更多