【问题标题】:How I can get the index of a row with a class on datatables如何在数据表上获取具有类的行的索引
【发布时间】:2020-12-15 19:49:14
【问题描述】:

我想获取具有“选定”类的行的索引。我怎样才能做到这一点?这失败了。

var datatable = '#mytableid';
var selectedclass='selected'; 
var table = $(datatable).dataTable();
var oSettings = table.fnSettings();

var selectedNode = table.row("."+selectedclass).node();

为此,我收到:“table.row 不是函数”

附加说明:表格使用分页,并且具有“选定”类的行可以在每个可用的分页页面上。

最后我想跳转到分页页面上属于这一行的这一行。

【问题讨论】:

  • 这里有一个更好的方法来提出这样的问题stackoverflow.com/questions/44637704/… 你能做出这样的小提琴吗? jsfiddle.net/subs65n8/2
  • 如果可以有多个页面包含“selected”类的行,您想跳转到这些页面中的哪一个? (这听起来更像是过滤的用例。)
  • 如果您的 HTML 表格的 ID 为“example” (<table id="example"...>),那么您需要使用var table = $('#example').DataTable()。否则 table 不会是 DataTable 对象,table.row() 不会是函数 - 这是你得到的错误。
  • @andrewjames “选定”类每次最多在一行。
  • @andrewjames 这部分我已经知道了,数据表包含#mytableid,我已经更新了我的帖子以使其清楚

标签: jquery datatables


【解决方案1】:

以下说明假定您使用的是最新版本的 DataTables。我的示例使用版本 1.10.22。

修复错误

要解决“table.row is not a function”问题,您可以更改以下行:

var table = $(mydatatable).dataTable();

到这里(注意大写的D):

var table = $(mydatatable).DataTable();

您需要这样做的原因是您创建对DataTables API 对象的引用的方式。可以通过以下 3 种方式中的任何一种来完成:

1 - $( selector ).DataTable();
2 - $( selector ).dataTable().api();
3 - new $.fn.dataTable.Api( selector );

在您的情况下,您混合使用了方法 1 和 2。

接下来,你需要改变这个:

var oSettings = table.fnSettings();

对此(参见settings() 函数):

var oSettings = table.settings();

现在您应该可以将表格行打印到浏览器控制台,作为测试:

console.log( table.row( '.selected' ) );

跳转到所需的行

有不止一种方法可以做到这一点 - 但这里有一种简单的方法:

首先,注册一个名为jumpToData()的新函数:

  jQuery.fn.dataTable.Api.register( 'page.jumpToData()', function ( data, column ) {
    var pos = this.column(column, {order:'current'}).data().indexOf( data );
    if ( pos >= 0 ) {
        var page = Math.floor( pos / this.page.info().length );
        this.page( page ).draw( false );
    }
    return this;
  } );

这个函数记录在here

现在,您需要在您的行中识别出该行独有的一条数据。在我的示例中,我使用的是标准 DataTables 示例数据 - 所以我有以下行,其中包含我们正在使用的 selected 类:

<tr class="selected">
    <td>Garrett Winters</td>
    <td>Accountant</td>
    <td>Tokyo</td>
    <td>63</td>
    <td>2011/07/25</td>
    <td>$170,750</td>
</tr>

在我的例子中,该行由第一列中的名称“Garrett Winters”唯一标识(列索引 = 0)。

因此我可以这样做:

var idColumn = 0;
var idValue = table.row( '.selected' ).data()[idColumn];    
table.page.jumpToData( idValue, idColumn );

这里有一点很重要:在我的例子中,数据是作为硬编码到 HTML 表中的值数组提供的,所以我使用 data()[0] 访问数据。如果数据是作为对象数组提供的,例如来自 JSON 对象,那么我需要在这里使用不同的语法——比如data()[personName]

整个过程如下:

<script type="text/javascript">

$(document).ready(function() {

  jQuery.fn.dataTable.Api.register( 'page.jumpToData()', function ( data, column ) {
    var pos = this.column(column, {order:'current'}).data().indexOf( data );
    if ( pos >= 0 ) {
        var page = Math.floor( pos / this.page.info().length );
        this.page( page ).draw( false );
    }
    return this;
  } );

  var datatable = '#mytableid';
  var selectedclass='selected'; 
  var table = $(datatable).DataTable();
  //var oSettings  = table.settings();

  var idColumn = 0;
  var idValue = table.row( '.selected' ).data()[idColumn];    
  table.page.jumpToData( idValue, idColumn );

} );

</script>

结果:

【讨论】:

  • @anrewjames 感谢您的详细回答,现在我像以前一样理解了一些东西。一个问题:您使用“idValue = table.row('.selected').data()[idColumn];”来获取单元格的值,有没有办法使用行的id来进行跳转?
  • 是的,您可以使用该 ID。如果你有&lt;tr id="row_id_123"&gt;,那么你可以使用table.row('#row_id_123')。您可以看到选择一行(或多行)here 的所有不同方式。
  • 好的,我用这种方式试了,但是不行!? var idColumn = 0; var idValue = table.row('#myrowid"); table.page.jumpToData(idValue,idColumn);
  • 您不能在jumpToData() 函数中使用&lt;tr&gt; 行ID。您必须使用该行数据值中的一条实际数据——从所有其他行中唯一标识该行的东西。在我的示例中,我使用人名“Garrett Winters”,取自行数据的第一个字段。
  • 是的 - 完全正确。来自实际数据的东西。这就是jumpToData() 函数的工作方式。因此,每一行都必须有一个唯一的值作为数据项
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 2022-10-15
  • 2023-03-05
  • 2015-08-23
  • 1970-01-01
  • 2020-03-04
相关资源
最近更新 更多