Datatables - Hộp tìm kiếm bên ngoài dữ liệu


Câu trả lời:


240

Bạn có thể sử dụng api DataTables để lọc bảng. Vì vậy, tất cả những gì bạn cần là trường đầu vào của riêng bạn với một sự kiện keyup kích hoạt chức năng lọc thành DataTables. Với css hoặc jquery, bạn có thể ẩn / xóa trường nhập tìm kiếm hiện có. Hoặc có thể DataTables có cài đặt để loại bỏ / không bao gồm nó.

Kiểm tra tài liệu API Datatables về điều này.

Thí dụ:

HTML

<input type="text" id="myInputTextField">

JS

oTable = $('#myTable').DataTable();   //pay attention to capital D, which is mandatory to retrieve "api" datatables' object, as @Lionel said
$('#myInputTextField').keyup(function(){
      oTable.search($(this).val()).draw() ;
})

8
Bạn chắc chắn nên sử dụng .keyup thay vì .keypress, nếu không bạn sẽ trải nghiệm một sự chậm trễ trong kết quả
Sævar

1
Tôi đã $(".dataTables_filter :input").focus().val(value).keypress();bối rối với việc keyupnhập đầu vào của mình trong khoảng một giờ, trước khi tìm thấy điều này. Không bao giờ sử dụng API .. Giải pháp thanh lịch!
MattSizzle

3
JS cần thay đổi để sử dụng .search ($ (this) .val ()) .draw () thay cho fnFilter. Xem: datatables.net/manual/api#Chaining Tôi đã thay đổi câu trả lời này để sửa nó, nhưng có vẻ như nó cần được đồng nghiệp đánh giá trước.
Shane Grant

13
Lưu ý: Bạn sẽ vẫn cần tùy chọn "seek: true" và sau đó, bạn có thể muốn ẩn hộp tìm kiếm mặc định, vì vậy chỉ cần đặt tùy chọn sDOM thành null.
bang

8
Khởi tạo $ (). DataTable () với một chữ "d" nhỏ sẽ trả về một đối tượng jQuery chứ không phải là một phiên bản API DataTables. Sau đó có thể đạt được bằng cách gọi "oTable = $ ('# myTable'). DataTable ();" với chữ "D" viết hoa. Điều này là bắt buộc để có thể gọi .search trên đó (nếu không sẽ tạo ra lỗi "function undefined"). Xem: datatables.net/faqs/#api
Lionel

34

Theo nhận xét của @lvkz:

nếu bạn đang sử dụng .DataTable()Datatable với chữ hoa d (điều này sẽ trả về một đối tượng Datatable API), hãy sử dụng:

 oTable.search($(this).val()).draw() ;

đó là câu trả lời @netbrain.

nếu bạn đang sử dụng datatable với chữ thường d .dataTable()(điều này sẽ trả về một đối tượng jquery), hãy sử dụng:

 oTable.fnFilter($(this).val());

4
oTable.fnFilter($(this).val());Làm việc cho tôi cũng vậy,
shabeer 90

10
Cả hai phương thức đều hợp lệ, tùy thuộc vào cách bạn đang gọi dữ liệu: `oTable.search ($ (this) .val ()). Draw ();` bạn sử dụng khi bạn gọi nó: .DataTable()và phương thức này: oTable.fnFilter($(this).val());khi bạn sử dụng .dataTable() Sự khác biệt là ở thủ đô D. Hy vọng nó sẽ giúp!
Lvkz

Đưa ra một "oTable.fnFilter được không phải là một chức năng" lỗi cho datatables phiên bản 1.10.5
Ege Bayrak

Chỉ cần hiểu rằng với jQuery, bạn cũng có thể truy cập API Cơ sở dữ liệu như thế này: oTable.api().search($(this).val()).draw();Nó có thể hữu ích, đặc biệt nếu bạn muốn kiểm soát thủ công đối với việc phân trang length:oTable.api().page.len($(this).val()).draw();
Ghis

15

Bạn có thể sử dụng sDomtùy chọn này.

Mặc định với đầu vào tìm kiếm trong div riêng của nó:

sDom: '<"search-box"r>lftip'

Nếu bạn sử dụng giao diện người dùng jQuery ( bjQueryUIđược đặt thành true):

sDom: '<"search-box"r><"H"lf>t<"F"ip>'

Ở trên sẽ đặt inputphần tử tìm kiếm / lọc vào riêng của nó divvới một lớp có tên search-boxnằm ngoài bảng thực tế.

Mặc dù nó sử dụng cú pháp viết tắt đặc biệt, nó thực sự có thể lấy bất kỳ HTML nào bạn ném vào nó.


@Marcus: thực sự thì tôi cảm thấy sDom không được đẹp để sử dụng, hãy gạt qua một thực tế là chúng tôi không thể tùy chỉnh hoàn toàn hộp tìm kiếm (có dòng chữ hardcode "Search" trong hộp đó).
Hoàng Long

nhưng nó vẫn nằm bên trong div.datatables_Wrapper, có cách nào để di chuyển nó ra bên ngoài không?
Artur79

@ Artur79 Đáng buồn là không. Ít nhất thì không phải không hack nguồn Datatable.
mekwall

2
<333 cú pháp này '<"search-box"r><"H"lf>t<"F"ip>'không chắc liệu có điều gì tồi tệ hơn tồn tại hay không
Cristian E.

@ Hoanglong bạn thực sự có thể tùy chỉnh hộp tìm kiếm bằng các tùy chọn như thế này:language: { search: "example", searchPlaceholder: "example" }
Flimm

8

Cái này đã giúp tôi cho DataTables Phiên bản 1.10.4, vì API mới của nó

var oTable = $('#myTable').DataTable();    
$('#myInputTextField').keyup(function(){
   oTable.search( $(this).val() ).draw();
})

Lưu ý chữ "D" viết hoa của "var oTable = $ ('# myTable'). DataTable ();" ( datatables.net/faqs/#api )
Lionel

6

Các phiên bản mới hơn có cú pháp khác:

var table = $('#example').DataTable();

// #myInput is a <input type="text"> element
$('#myInput').on('keyup change', function () {
    table.search(this.value).draw();
});

Lưu ý rằng ví dụ này sử dụng biến tableđược gán khi các dữ liệu được khởi tạo lần đầu tiên. Nếu bạn không có sẵn biến này, chỉ cần sử dụng:

var table = $('#example').dataTable().api();

// #myInput is a <input type="text"> element
$('#myInput').on('keyup change', function () {
    table.search(this.value).draw();
});

Kể từ: DataTables 1.10

- Nguồn: https://datatables.net/reference/api/search ()


4

Điều này sẽ phù hợp với bạn: (DataTables 1.10.7)

oTable = $('#myTable').dataTable();

$('#myInputTextField').on('keyup change', function(){
  oTable.api().search($(this).val()).draw();
})

hoặc là

oTable = $('#myTable').DataTable();

$('#myInputTextField').on('keyup change', function(){
  oTable.search($(this).val()).draw();
})

4

Tôi đã từng gặp vấn đề tương tự.

Tôi đã thử tất cả các lựa chọn thay thế được đăng, nhưng không có tác dụng, tôi đã sử dụng một cách không đúng nhưng nó hoạt động hoàn hảo.

Đầu vào tìm kiếm mẫu

<input id="serachInput" type="text"> 

mã jquery

$('#listingData').dataTable({
  responsive: true,
  "bFilter": true // show search input
});
$("#listingData_filter").addClass("hidden"); // hidden search input

$("#serachInput").on("input", function (e) {
   e.preventDefault();
   $('#listingData').DataTable().search($(this).val()).draw();
});

4

Tôi muốn thêm một điều nữa vào câu trả lời của @ netbrain có liên quan trong trường hợp bạn sử dụng xử lý phía máy chủ (xem tùy chọn serverSide ).

Điều chỉnh truy vấn được thực hiện theo mặc định bởi các tệp dữ liệu (xem tùy chọn searchDelay ) không áp dụng cho lệnh .search()gọi API. Bạn có thể lấy lại bằng cách sử dụng $ .fn.dataTable.util.throttle () theo cách sau:

var table = $('#myTable').DataTable();
var search = $.fn.dataTable.util.throttle(
    function(val) {
        table.search(val).draw();
    },
    400  // Search delay in ms
);

$('#mySearchBox').keyup(function() {
    search(this.value);
});

1

Bạn có thể di chuyển div khi bảng được vẽ bằng fnDrawCallbackhàm.

    $("#myTable").dataTable({
    "fnDrawCallback": function (oSettings) {
        $(".dataTables_filter").each(function () {
            $(this).appendTo($(this).parent().siblings(".panel-body"));
        });
    }
});

Hoặc nếu bạn sử dụng một phiên bản mới hơn của DataTable bạn sẽ có:"drawCallback": function (settings) { $(".dataTables_filter").each(function () { $(this).appendTo($(this).parent().siblings(".panel-body")); }); },
Daniel Dudás

1
$('#example').DataTable({
   "bProcessing": true,
   "bServerSide": true,
   "sAjaxSource": "../admin/ajax/loadtransajax.php",
   "fnServerParams": function (aoData) {
        // Initialize your variables here
        // I have assign the textbox value for "text_min_val"
        var min_val = $("#min").val();  //push to the aoData
        aoData.push({name: "text_min_val", value:min_val});
   },
   "fnCreatedRow": function (nRow, aData, iDataIndex) {
       $(nRow).attr('id', 'tr_' + aData[0]);
       $(nRow).attr('name', 'tr_' + aData[0]);
       $(nRow).attr('min', 'tr_' + aData[0]); 
       $(nRow).attr('max', 'tr_' + aData[0]); 
   }
});

Trong loadtransajax.phpbạn có thể nhận được giá trị nhận được:

if ($_GET['text_min_val']){
    $sWhere = "WHERE ("; 
    $sWhere .= " t_group_no LIKE '%" . mysql_real_escape_string($_GET['text_min_val']) . "%' ";
    $sWhere .= ')';
}

0

Nếu bạn đang sử dụng JQuery dataTable, bạn chỉ cần thêm vào "bFilter":true. Điều này sẽ hiển thị hộp tìm kiếm mặc định bên ngoài bảng và nó hoạt động động..như mong đợi

$("#archivedAssignments").dataTable({
                "sPaginationType": "full_numbers",
                "bFilter":true,
                "sPageFirst": false,
                "sPageLast": false,
                "oLanguage": {
                "oPaginate": {
                    "sPrevious": "<< previous",
                    "sNext" : "Next >>",
                    "sFirst": "<<",
                    "sLast": ">>"
                    }
                },
            "bJQueryUI": false,
            "bLengthChange": false,
            "bInfo":false,
            "bSortable":true
        });    

Câu hỏi là để thay đổi vị trí của động được tạo ra. Đưa nó ra BÊN NGOÀI bảng
MC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.