jQuery Datatables:使用Ajax分页进行搜索和过滤

Pau*_*rps 6 search jquery filtering datatables paginate

我有一个SQL表,有36000个条目显示在Datatables列表中.由于我像这样开发它,所以分页效果很好:

var table = $('.datatable').DataTable({
    pageLength : 20,
    lengthChange : false,
    processing : true,
    serverSide : true,
    ajax : {
        url :"ajax.php",
        type: "post",
    }
});
Run Code Online (Sandbox Code Playgroud)

在我的文件ajax.php中,我根据页码设置的限制简单地回显我的行(JSON编码).

问题是本机过滤和搜索不再有效.当我想过滤一列时,会出现"处理"图层,然后消失,但我的数据仍然相同.当我想通过表格进行研究时,没有任何反应.

所以,这是我的问题:

  1. 如何恢复搜索和过滤?
  2. 如何过滤和搜索所有行(不仅是显示的行)?有了Ajax,是的,但在Jquery中呢?

提前致谢

编辑: 感谢Abdul Rehman Sayed,我设法做了搜索部分.这是我做的:

var table = $('.datatable').DataTable({
    pageLength : 20,
    lengthChange : false,
    processing : true,
    serverSide : true,
    ajax : {
        data : function(d) {
            d.searching = get_search($('.datatable'));
        },
        url :"ajax.php",
        type: "post",
    },
    searching : false,
});

$('.datatable thead th').each(function() {
    var title = $(this).data('name');
    $('.datatable').find('tfoot tr').append('<td><input type="text" name="'+title+'"/></td>');
});

table.columns().every(function() {
    var that = this;
    $('input', this.footer()).on('keyup', function(e) {
        that.search(this.value).draw();
    }
});

function get_search(datatable) {
    var result = [];
    datatable.find('tfoot').find('input').each(function() {
        result.push([$(this).attr('name'), $(this).val()]);
    });
    return result;
}
Run Code Online (Sandbox Code Playgroud)

对于过滤,我开发了一个丑陋的代码:

$('.datatable').find('th').click(function() {
    var item = $(this);
    removeClasses($('.datatable'), item.index());
    if(item.hasClass('sorting_asc')) {
        item.removeClass('selected_asc').addClass('selected_desc');
    } else {
        item.removeClass('selected_desc').addClass('selected_asc');
    }
});

function get_sorting(datatable) {
    var result = false;
    datatable.find('th').each(function() {
        var item = $(this);
        var name = item.data('name');
        if(item.hasClass('selected_asc')) {
            result = name+' ASC';
        } else if(item.hasClass('selected_desc')) {
            result = name+' DESC';
        } else {
            // continue
        }
    });
    return result;
}

function removeClasses(datatable, index) {
    datatable.find('th').each(function() {
        if($(this).index() !== index) {
            $(this).removeClass().addClass('sorting');
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

Abd*_*yed 9

您将不得不在服务器端进行所有搜索和过滤.

对于搜索/过滤器或页面的每个请求,数据表将所有这些作为表单数据传递到服务器页面.请参阅https://www.datatables.net/manual/server-side

您必须使用此表单数据来过滤/搜索/分页sql表上的记录并将其相应地传递给客户端.

数据表仅显示从服务器获取的内容.