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

时间:2015-09-07 12:23:45

标签: jquery search datatables filtering paginate

我有一个SQL表,其36000个条目显示在Datatables列表中。 自从我这样开发以来,分页效果很好:

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

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

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

所以,这是我的问题:

  1. 如何恢复搜索和过滤?
  2. 如何过滤和搜索所有行(不仅是显示的行)?有了Ajax,是的,但在Jquery中怎么样?
  3. 提前感谢

    编辑: 感谢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;
    }
    

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

    $('.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');
            }
        });
    }
    

2 个答案:

答案 0 :(得分:9)

你将不得不做所有的搜索和在服务器端过滤。

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

您必须使用此表单数据来过滤/搜索/分页sql table&amp;上的记录。相应地传递给客户。

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

答案 1 :(得分:0)

只需在 URL 本身中传递参数

var table = $('.datatable').DataTable({
    pageLength : 20,
    lengthChange : false,
    processing : true,
    serverSide : true,
    ajax : {
        url :`ajax.php?param_name=${$("#filter").val()}`
    }
});

此代码有效