Javascript 如何使用columns().every()仅检索包含筛选元素的列

Javascript 如何使用columns().every()仅检索包含筛选元素的列,javascript,jquery,datatables,Javascript,Jquery,Datatables,我有一个DataTable,它要求我检索每列中最长的.text()元素。为了实现这一点,我实现了以下脚本 $('#example').DataTable({ deferRender: true, autoWidth: false, drawCallback: function () { var table = $('#example').DataTable(); table.columns().every(function

我有一个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()元素,但如果进行筛选,它将继续从每列的整个行列表中提取,而不管它们是否可见


示例。。。“未过滤”

  • 鳟鱼(可见)
  • 鲶鱼(可见)
  • 腔棘鱼(可见)
  • 在这个场景中,我的函数返回“腔棘鱼”,这是正确的


    示例。。。“过滤”

    如果我将此数据表筛选为“Cat”。。。将只显示一个可见行。。。“鲶鱼”

  • 鳟鱼(隐藏)
  • 鲶鱼(可见)
  • 腔棘鱼(隐藏)

  • 在这个场景中,我的函数应该返回“Catfish”,但它会继续返回“腔棘鱼”。有没有办法让它忽略任何过滤行,只从屏幕上可见的“过滤”项中提取

    提前谢谢

    解决方案

    使用适当的(
    {search:'applied'}
    )解释当前搜索查询,如果适用:

    /。。。跳过。。。
    table.columns().every(函数(索引){
    var longestSoFar=-1;
    var Longestem;
    var column=table.column(索引,{search:'applied'});
    column.nodes()到$()。每个(函数(){
    //…跳过。。。
    
    演示

    有关代码和演示,请参阅

    注释

    jQuery DataTables版本1.10.6-1.10.9存在一个问题,其中(
    {search:'applied'}
    )不能用作API方法的参数,请参见此

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

    /…已跳过。。。
    变量表=$(“#示例”).DataTable();
    table.columns({search:'applied'}).every(函数(索引){
    this.nodes()到$()。每个(函数(){
    //…跳过。。。
    
    它仍然会返回所有结果,甚至是从过滤器中删除的结果。其他任何人都需要注意……至少需要DataTables 1.10.9。@kojay,我的示例使用1.10.9,但
    columns()。every()
    从1.10.6开始提供。人们甚至可以使用从1.10.0开始提供的。我完全同意你的看法。但是,使用上面的脚本和1.10.6有一个奇怪的复制问题。它会提取第一列的最长元素,并记录表中的每一列。当我检查DT的当前版本号时,我使用的是1.10.6并注意到您使用了1.10.9,所以我升级了我的版本,并按照您概述的那样工作。我只是不希望任何其他人尝试复制它,收到错误的结果,因为您的脚本在各个方面都是完美的。