在 datatables table 中查找和修改已过滤的行中的数据

Finding and modifying data in rows that have been filtered in a datatables table

我动态生成了 tables,其中包含来自多个来源的数据。根据来源的不同,每个 table 的列数会有所不同。我正在构建一项功能,允许用户刷新来自各种来源的数据,仅更新相关行。

生成为 HTML 后,table 在 tr 元素中具有 类 以标识行的来源。我写了一些简化的代码,其工作方式与我的真实代码相同,用于刷新 this jsfiddle 中的 table,如下所示。

问题是,如果用户过滤 table(使用数据tables 过滤器),如果单元格在用户刷新数据时不可见,则不会更新.在示例代码中,如果您在行 ID 32 可见时按下刷新按钮,它将被更新。例如,如果您过滤 33 然后按下按钮,行 ID 32 将不会更新为新的随机值。请注意,这些是 类,因为在真实情况下,有多个 类 可根据源和行 ID 提供唯一 ID - 多个行可能具有来自不同来源的相同 ID。

如何更新隐藏行的 HTML?根据示例代码,当我获取需要更新的数据时,我将知道行 ID,并且我将拥有一个与列顺序相同的新值数组(即数组位置 0 = td:nth- child(1))

$("table").dataTable();

$("#changeCell").on("click", function() {
$("tr.row-id-32 td:nth-child(1)").html("Val 32-1 NEW:"+Math.random());
$("tr.row-id-32 td:nth-child(2)").html("Val 32-2 NEW:"+Math.random());
});
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/jquery.dataTables.min.js"></script>

<button id="changeCell">Change row ID 32</button>

<table border=1>
<thead><tr><th>Col 1</th><th>Col 2</th></tr></thead>
<tbody>
  <tr class="row-id-32"><td>Val 32-1</td><td>Val 32-2</td></tr>
  <tr class="row-id-33"><td>Val 33-1</td><td>Val 33-2</td></tr>
  <tr class="row-id-34"><td>Val 34-1</td><td>Val 34-2</td></tr>
</tbody>
</table>

您可以使用 DataTables API 来定位您想要的行,无论该行当前是否显示,或者是否在另一个 DataTables 页面上。

步骤:

  1. 运行 片段。

  2. 单击“更改行 ID 37”按钮。

  3. 导航到第 2 页以查看对行 ID 37 所做的更改。

$(document).ready(function() {

  var table = $('#example').DataTable( {
    "pageLength": 4
  } );

  $("#changeCell").on("click", function() {
    var node = table.rows('.row-id-37').nodes();
    $( node ).find('td:nth-child(1)').html("Val 37-1 NEW:"+Math.random());
    $( node ).find('td:nth-child(2)').html("Val 37-2 NEW:"+Math.random());
  });

} );
<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Demo</title>
  <script src="https://code.jquery.com/jquery-3.5.1.js"></script>
  <script src="https://cdn.datatables.net/1.10.22/js/jquery.dataTables.js"></script>
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.22/css/jquery.dataTables.css">
  <link rel="stylesheet" type="text/css" href="https://datatables.net/media/css/site-examples.css">

</head>

<body>

<div style="margin: 20px;">

    <button id="changeCell">Change row ID 37</button>

    <br><br>

    <table id="example" class="display dataTable cell-border" style="width:100%">
        <thead>
            <tr><th>Col 1</th><th>Col 2</th></tr>
        </thead>
            <tbody>
                <tr class="row-id-32"><td>Val 32-1</td><td>Val 32-2</td></tr>
                <tr class="row-id-33"><td>Val 33-1</td><td>Val 33-2</td></tr>
                <tr class="row-id-34"><td>Val 34-1</td><td>Val 34-2</td></tr>
                <tr class="row-id-35"><td>Val 35-1</td><td>Val 35-2</td></tr>
                <tr class="row-id-36"><td>Val 36-1</td><td>Val 36-2</td></tr>
                <tr class="row-id-37"><td>Val 37-1</td><td>Val 37-2</td></tr>
                <tr class="row-id-38"><td>Val 38-1</td><td>Val 38-2</td></tr>
            </tbody>
    </table>

</div>

</body>
</html>

这在几个方面建立在您的逻辑之上:

  1. 它在初始化时将table分配给一个变量,因此我们可以访问数据表API:

    var table = $('#example').DataTable();

在我的示例中,仅针对 testing/demo,我强制每个页面仅显示 4 行,以确保有一个“第 2 页”- 这是更新发生的地方。

  1. 它使用 DataTables API 到 select 使用 jQuery select 或:

    的行

    var node = table.rows('.row-id-37').nodes();

注意:因为它使用了class,所以可能会返回多个节点。鉴于您的 class 标识符是唯一的(我假设),您可能希望在 HTML.

中使用 ID 而不是 class

一旦你有了一个节点(或多个节点),你可以使用 jQuery 更新它(或它们)——就像你的代码一样。

使用 DataTables API 的好处是,这是存储 所有 数据的地方,而不管哪个子集恰好显示在 DOM/page 在任何特定时间点。

有关详细信息,请参阅 rows() and row-selector