如何使用columns()。every()来检索仅包含已过滤元素的列

时间:2015-09-24 18:07:02

标签: javascript jquery datatables

我有一个DataTable,要求我检索每列的最长.text()元素。为此,我实现了以下脚本。

$('#example').DataTable({
     deferRender: true,
     autoWidth: false,
     drawCallback: function () {

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

          table.columns().every(function () {

               var longestSoFar = -1;
               var longestItem;

               this.nodes().to$().each(function () {

                    var text = $(this).text();
                    if (text.length > longestSoFar) {
                         longestSoFar = text.length;
                         longestItem = this;
                    }
               });

               var longestTD = $(longestItem).html();

               console.log(longestTD);

          });
     }
});

此脚本正常工作并记录每列的最长.text()元素,但如果进行过滤,则会继续从每列的整个行列表中提取,无论它们是否可见。

示例..."未经过滤的"

FISH

  1. 鳟鱼(可见)
  2. 鲶鱼(可见)
  3. Coelacanth(可见)
  4. 在这种情况下,我的函数返回" Coelacanth",这是正确的。

    示例..."已过滤"

    如果我过滤这个DataTable用于" Cat" ...只会显示一个可见的行..." Catfish"。

    FISH

    1. 鳟鱼(隐藏)
    2. 鲶鱼(可见)
    3. Coelacanth(隐藏)
    4. 在这种情况下,我的函数应该返回" Catfish",而是继续返回" Coelacanth"。有没有办法让这个忽略任何过滤的行,只有从"过滤的"屏幕上显示的项目?

      提前致谢。

1 个答案:

答案 0 :(得分:3)

  

<强>解

使用适当的selector-modifier{ search: 'applied' })来考虑当前的搜索查询(如果适用):

// ... skipped ...

table.columns().every(function (index) {
   var longestSoFar = -1;
   var longestItem;

   var column = table.column(index, { search: 'applied' });
   column.nodes().to$().each(function () {

// ... skipped ...
  

<强>样本

请参阅this jsFiddle以获取代码和演示。

  

备注

jQuery DataTables版本1.10.6 - 1.10.9存在问题,其中selector-modifier{ search: 'applied' })无法用作columns().every() API方法的参数,请参阅此issue #679

如果使用1.10.9之后发布的nightly build或jQuery DataTables版本,则可以使用以下代码:

// ... skipped ...

var table = $('#example').DataTable();
table.columns({ search: 'applied' }).every(function (index) {

   this.nodes().to$().each(function () {
   // ... skipped ...