Datatables - ช่องค้นหาภายนอก datatable


คำตอบ:


240

คุณสามารถใช้ DataTables api เพื่อกรองตาราง ดังนั้นสิ่งที่คุณต้องมีคือช่องป้อนข้อมูลของคุณเองพร้อมด้วยเหตุการณ์การกดปุ่มที่เรียกฟังก์ชันตัวกรองไปยัง DataTables ด้วย css หรือ jquery คุณสามารถซ่อน / ลบช่องป้อนข้อมูลการค้นหาที่มีอยู่ได้ หรือบางที DataTables มีการตั้งค่าเพื่อลบ / ไม่รวมไว้

ตรวจสอบเอกสาร Datatables API ในเรื่องนี้

ตัวอย่าง:

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
แน่นอนคุณควรใช้. keyup แทน. keypress มิฉะนั้นคุณจะพบความล่าช้าในผลลัพธ์
Sævar

1
ฉันสับสนกับการวาง$(".dataTables_filter :input").focus().val(value).keypress();ในkeyupการป้อนข้อมูลของฉันประมาณหนึ่งชั่วโมงก่อนที่จะหานี้ ไม่ว่าจะใช้ API .. โซลูชันที่สวยงาม!
MattSizzle

3
JS จำเป็นต้องเปลี่ยนไปใช้ .search ($ (this) .val ()) .draw () แทน fnFilter ดู: datatables.net/manual/api#Chainingฉันเปลี่ยนคำตอบนี้เพื่อแก้ไข แต่ดูเหมือนว่าจะต้องได้รับการตรวจสอบโดยเพื่อนก่อน
Shane Grant

13
หมายเหตุ: คุณยังคงต้องใช้ตัวเลือก "การค้นหา: true" จากนั้นคุณอาจต้องการซ่อนช่องค้นหาเริ่มต้นดังนั้นเพียงตั้งค่าตัวเลือก sDOM เป็น null
ปัง

8
การสร้างอินสแตนซ์ $ () dataTable () ด้วย "d" ขนาดเล็กจะส่งคืนออบเจ็กต์ jQuery แทนที่จะเป็นอินสแตนซ์ DataTables API หลังสามารถทำได้โดยเรียก "oTable = $ ('# myTable') DataTable ();" ด้วยทุน "D" สิ่งนี้จำเป็นเพื่อให้สามารถเรียก. ค้นหาได้ (หากจะแสดงข้อผิดพลาด "function undefined" เป็นอย่างอื่น) ดู: datatables.net/faqs/#api
Lionel

34

ตามความคิดเห็น @lvkz:

หากคุณใช้ datatable กับตัวพิมพ์ใหญ่ d .DataTable()(สิ่งนี้จะส่งคืนอ็อบเจ็กต์ Datatable API) ให้ใช้สิ่งนี้:

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

ซึ่งเป็นคำตอบ @netbrain

หากคุณใช้ datatable กับตัวพิมพ์เล็ก d .dataTable()(สิ่งนี้จะส่งคืนวัตถุ jquery) ให้ใช้สิ่งนี้:

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

4
oTable.fnFilter($(this).val());ทำงานให้ฉันด้วย
shabeer90

10
ทั้งสองวิธีนั้นถูกต้องขึ้นอยู่กับว่าคุณเรียกใช้ datatable อย่างไร: `oTable.search ($ (this) .val ()). draw ();` คุณใช้เมื่อคุณเรียกมันว่า: .DataTable()และวิธีนี้: oTable.fnFilter($(this).val());เมื่อคุณใช้.dataTable() ความแตกต่าง อยู่ที่เมืองหลวง D. หวังว่ามันจะช่วยได้!
Lvkz

ให้ข้อผิดพลาด "oTable.fnFilter is not a function" สำหรับ datatables เวอร์ชัน 1.10.5
Ege Bayrak

เพิ่งคิดว่าด้วย jQuery คุณสามารถเข้าถึง Database API ได้เช่นนี้oTable.api().search($(this).val()).draw();มันมีประโยชน์โดยเฉพาะอย่างยิ่งถ้าคุณต้องการควบคุมการแบ่งหน้าlengthด้วยตนเองเช่นกัน:oTable.api().page.len($(this).val()).draw();
Ghis

15

คุณสามารถใช้sDomตัวเลือกนี้ได้

เริ่มต้นด้วยการป้อนข้อมูลการค้นหาใน div ของตัวเอง:

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

หากคุณใช้ jQuery UI ( bjQueryUIตั้งค่าเป็นtrue):

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

ข้างต้นจะใส่inputองค์ประกอบการค้นหา / การกรองเป็นของตัวเองdivโดยมีคลาสที่ชื่อsearch-boxอยู่นอกตารางจริง

แม้ว่าจะใช้ไวยากรณ์ชวเลขพิเศษ แต่ก็สามารถใช้ HTML ใด ๆ ที่คุณโยนไปได้


@Marcus: จริงๆแล้วฉันรู้สึกว่า sDom ใช้งานได้ไม่ค่อยสวยงามนัก แต่ทิ้งความจริงที่ว่าเราไม่สามารถปรับแต่งช่องค้นหาได้อย่างสมบูรณ์ (มีข้อความ "Search" ในช่องนั้น)
Hoàng Long

แต่มันยังอยู่ใน div.datatables_Wrapper วิธีใดที่จะย้ายมันออกไปข้างนอกด้วย?
Artur79

@ Artur79 เศร้าเลย ไม่ใช่โดยไม่ต้องแฮ็กแหล่งที่มาของ Datatables อย่างน้อย
mekwall

2
<333 ไวยากรณ์นี้'<"search-box"r><"H"lf>t<"F"ip>'ไม่แน่ใจว่ามีบางอย่างที่แย่กว่านี้หรือไม่
Cristian E.

@ HoàngLongคุณสามารถปรับแต่งช่องค้นหาได้โดยใช้ตัวเลือกเช่นนี้:language: { search: "example", searchPlaceholder: "example" }
Flimm

8

สิ่งนี้ช่วยฉันสำหรับ DataTables เวอร์ชัน 1.10.4 เนื่องจาก API ใหม่

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

สังเกตตัวพิมพ์ใหญ่ "D" ของ "var oTable = $ ('# myTable') DataTable ();" ( datatables.net/faqs/#api )
Lionel

6

เวอร์ชันล่าสุดมีไวยากรณ์ที่แตกต่างกัน:

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

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

โปรดสังเกตว่าตัวอย่างนี้ใช้ตัวแปรที่tableกำหนดเมื่อดาต้าเบสเริ่มต้นครั้งแรก หากคุณไม่มีตัวแปรนี้ให้ใช้:

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

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

ตั้งแต่: DataTables 1.10.2

- ที่มา: https://datatables.net/reference/api/search ()


4

สิ่งนี้น่าจะเหมาะกับคุณ: (DataTables 1.10.7)

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

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

หรือ

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

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

4

ผมมีปัญหาเหมือนกัน.

ฉันลองใช้ทางเลือกอื่นที่โพสต์แล้ว แต่ไม่ได้ผลฉันใช้วิธีที่ไม่ถูกต้อง แต่ทำงานได้อย่างสมบูรณ์

ตัวอย่างการป้อนข้อมูลการค้นหา

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

รหัส 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

ฉันต้องการเพิ่มอีกสิ่งหนึ่งในคำตอบของ @ netbrain ที่เกี่ยวข้องในกรณีที่คุณใช้การประมวลผลฝั่งเซิร์ฟเวอร์ (ดูที่serverSideตัวเลือก )

การควบคุมปริมาณการสืบค้นดำเนินการโดยค่าเริ่มต้นโดยดาต้าเบิล (ดูตัวเลือกsearchDelay ) ใช้ไม่ได้กับการ.search()เรียก API คุณสามารถรับคืนได้โดยใช้$ .fn.dataTable.util.throttle ()ตามวิธีต่อไปนี้:

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

คุณสามารถย้าย div เมื่อวาดตารางโดยใช้fnDrawCallbackฟังก์ชัน

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

หรือถ้าคุณใช้ datatable เวอร์ชันใหม่กว่าคุณจะมี:"drawCallback": function (settings) { $(".dataTables_filter").each(function () { $(this).appendTo($(this).parent().siblings(".panel-body")); }); },
Daniel Dudas

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]); 
   }
});

ในloadtransajax.phpคุณอาจได้รับค่ารับไปนี้:

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

0

หากคุณใช้ JQuery dataTable ดังนั้นคุณต้องเพิ่ม"bFilter":trueไฟล์. สิ่งนี้จะแสดงช่องค้นหาเริ่มต้นนอกตารางและทำงานแบบไดนามิก. ตามที่คาดไว้

$("#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
        });    

คำถามคือการเปลี่ยนตำแหน่งของสิ่งที่สร้างขึ้นแบบไดนามิก วางไว้ด้านนอกโต๊ะ
MC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.