不使用全局对象进行过滤

时间:2015-08-13 23:12:35

标签: javascript jquery datatables

我有一个有时会显示并有时隐藏的数据表。我在同一页面上还有其他几个表格。

数据表示例(located here)使用全局对象存储自定义函数$.fn.dataTable.ext.search。这很好,但它会影响所有表格。

我无法找到一种方法来提供每个表的搜索功能,而不是将其添加到全局变量。

这是我到目前为止所做的:

t.rows().data().filter(
  function(val, idx){ 
    console.log("Value: " + JSON.stringify(val) + " at " + idx); 
    if(idx < 2) {return true;} return false;
  })

这样可行,但我如何用新行重绘表格呢?调用t.draw()不起作用,接下来是什么?

这是编辑前的旧问题:

这是我的过滤器的初始代码,它运行并打印出我期望的内容,但我无法将其隔离为仅在页面上的一个表上运行。我无法分辨它在函数中的哪个表(我不认为),但我真的只想在某个表上调用该函数。

$.fn.dataTable.ext.search.push(
    function(settings, data, dataIndex ) 
    { 
        console.log(settings); 
        console.log(data); 
        console.log(dataIndex); 
    });

1 个答案:

答案 0 :(得分:2)

您从搜索功能收到的第一个参数是settings变量,其中包含DataTable的完整配置和数据。这样,您就可以访问表格API

然后,您可以使用table().node()到达代码的节点(它返回表格的DOM元素):

var tablesToSearchArray = new Array("example2");

$.fn.dataTable.ext.search.push(function(settings, data, dataIndex) {
    var api = new $.fn.dataTable.Api( settings );
    var tableId = api.table().node().id;

    if (tablesToSearchArray.indexOf(tableId) === -1) {
        return true; // don't filter this table.
    }

    var min = parseInt($('#min').val(), 10);
    var max = parseInt($('#max').val(), 10);
    var age = parseFloat(data[3]) || 0; // use data for the age column

    if ( ( isNaN( min ) && isNaN( max ) ) ||
         ( isNaN( min ) && age <= max ) ||
         ( min <= age   && isNaN( max ) ) ||
         ( min <= age   && age <= max ) )
    {
        return true;
    }
    return false;
});

$(document).ready(function() {
    var table = $('#example').DataTable();
    var table2 = $('#example2').DataTable();

    $('#min, #max').keyup(function() {
        table.draw();
        table2.draw(); // just so you see it won't filter
    });
});

这是基于DataTables网站的example。查看JSFiddle