【问题标题】:Filtering firstname and lastname using datatable.js使用 datatable.js 过滤名字和姓氏
【发布时间】:2015-09-01 05:22:15
【问题描述】:

我创建了一个使用 dataTable 过滤名字和姓氏的应用程序,我有一个名字和姓氏文本字段,我将通过它过滤名字和姓氏。过滤正在工作,但问题是名字和姓氏过滤都是从文本字段中进行的,实际上我需要以这样的方式使其具体化,即名字文本字段仅用于名字过滤,而姓氏文本字段仅用于姓氏过滤

谁能告诉我一些解决方法?

JSFiddle

我的代码如下:

$(document).ready(function () {
    myTable = $('#myTable').dataTable({
            "bSort": false,
            "bInfo": false,
            "bLengthChange": false,
            "bPaginate": false,
            "scrollY": "300px",
            "scrollX": "100%",
            "scrollCollapse": true,
    });

    new $.fn.dataTable.FixedColumns(myTable, {
        leftColumns: 1,
        rightColumns: 1
    });

   $('#firstNameTextBox').keyup(function () {
        filterNames(this.value, 0);
    });

     $('#secondNameTextBox').keyup(function () {
        filterNames(this.value, 0);
    });


    function filterNames(value) {
        myTable.fnFilter(value, 0, false, false, false, false);
    }
});

【问题讨论】:

    标签: javascript jquery datatable filtering


    【解决方案1】:

    一种方法是使用custom filtering (>1.10)

    每次绘制表格时都会执行这段代码。该方法从字段中获取第一个和第二个名称并创建一个正则表达式。 data[0].replace 删除了名字和名字之间的空格,并转换为一个数组,该数组稍后用于再次测试正则表达式。

    $.fn.dataTable.ext.search.push(
        function( settings, data, dataIndex ) {
            var firstName = $('#firstNameTextBox').val();
            var secondName = $('#secondNameTextBox').val();
            var fnRegex = new RegExp(firstName, 'i');
            var snRegex = new RegExp(secondName, 'i');
            var name = data[0].replace(/[^\w\s]|_/g, function ($1) { return ' ' + $1 + ' ';}).replace(/[ ]+/g, ' ').split(' '); // courtesy: http://stackoverflow.com/a/6162630
            return fnRegex.test(name[0]) && snRegex.test(name[1]);
        }
    );
    

    说明:

    var fnRegex = new RegExp(firstName, 'i'); 
    

    这将在您输入名字文本字段时创建一个像这样的正则表达式

    /J/i
    /Je/i 
    /Jef/i
    /Jeff/i
    

    第二个名字文本域也是如此

    var snRegex = new RegExp(secondName, 'i');
    

    由于表格数据看起来像这样Jefferey Sam。下面的.replace() 方法行会将其分解为类似["Jeffrey", "Sam"] 的数组,以便正则表达式可以单独检查每个元素。

    var name = data[0].replace(/[^\w\s]|_/g, function ($1) { 
        return ' ' + $1 + ' ';
    })
    .replace(/[ ]+/g, ' ')
    .split(' ');
    

    $.fn.datatable.ext.search 遍历每一行并将这些行添加到返回 true 的表中。 (最后一行)

    return fnRegex.test(name[0]) && snRegex.test(name[1]);
    

    名字和名字正则表达式都针对数组的第一个值(名字)和数组的第二个值(名字)进行测试。 regex.test 将返回真或假。

    如果用户在名字文本字段中输入Jeff,在第二字段中输入Sa,下面是$.fn.datatable.ext.search.push 每行的样子

    return /Jeff/i.test("Jefferey") && /Sa/i.test("Sa"); // true && true ===> true (so this will be added);
    return /Jeff/i.test("Linsu") && /Sa/i.test("Lessi"); // false && false ===> false (so this will NOT be added).
    return ..... // so on for the rest of the rows
    

    这是一个演示http://jsfiddle.net/dhirajbodicherla/189Lp6u6/2/


    版本

    单独的draw方法改为下面

    var myTable = $('').dataTable() with (lowercase D)
    myTable.api().draw();
    

    这是一个演示http://jsfiddle.net/dhirajbodicherla/189Lp6u6/3/

    希望对你有帮助

    【讨论】:

    • .dataTable({.DataTable({ 相同,因为我使用的是.dataTable({
    • 不一样。一个返回一个 jquery 对象,另一个返回一个数据表对象。但这仍然不应该是一个问题。检查这个datatables.net/new/1.10
    • 如何在.dataTable中使用它,你能给我jsfiddle吗
    • @AlexMan:更新了我的答案,请立即查看
    • 你能详细解释一下自定义过滤器函数中的最后四行吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多