Datentabellen - Suchfeld außerhalb der Datentabelle

117

Ich verwende DataTables ( datatables.net ) und möchte, dass sich mein Suchfeld außerhalb der Tabelle befindet (z. B. in meinem Header div).

Ist das möglich ?

Athanasios Emmanouilidis
quelle

Antworten:

240

Sie können die DataTables-API verwenden, um die Tabelle zu filtern. Sie benötigen also nur ein eigenes Eingabefeld mit einem Keyup-Ereignis, das die Filterfunktion für DataTables auslöst. Mit CSS oder JQuery können Sie das vorhandene Sucheingabefeld ausblenden / entfernen. Oder DataTables hat eine Einstellung zum Entfernen / Nichteinschließen.

Überprüfen Sie hierzu die Dokumentation zur Datatables-API.

Beispiel:

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() ;
})
Netzhirn
quelle
8
Sie sollten auf jeden Fall .keyup anstelle von .keypress verwenden, da sonst die Ergebnisse verzögert werden
Sævar
1
Ich verwirrte mit dem Setzen $(".dataTables_filter :input").focus().val(value).keypress();in denen keyupauf meinem Input für etwa eine Stunde, bevor diese zu finden. Niemals die API verwenden. Elegante Lösung!
MattSizzle
3
Das JS muss geändert werden, um .search ($ (this) .val ()) .draw () anstelle von fnFilter zu verwenden. Siehe: datatables.net/manual/api#Chaining Ich habe diese Antwort geändert, um sie zu beheben, aber es scheint, dass sie zuerst einer Peer-Review unterzogen werden muss.
Shane Grant
13
Anmerkung: Sie benötigen weiterhin die Option "search: true", und dann möchten Sie wahrscheinlich das Standardsuchfeld ausblenden. Setzen Sie also einfach die Option sDOM auf null.
Knall
8
Wenn Sie $ (). DataTable () mit einem kleinen "d" instanziieren, wird ein jQuery-Objekt anstelle einer DataTables-API-Instanz zurückgegeben. Letzteres kann durch Aufrufen von "oTable = $ ('# myTable'). DataTable ();" erreicht werden. mit einem Großbuchstaben "D". Dies ist erforderlich, um .search darauf aufrufen zu können (wenn andernfalls der Fehler "function undefined" ausgegeben wird). Siehe: datatables.net/faqs/#api
Lionel
34

Gemäß @ lvkz Kommentar:

Wenn Sie datatable mit Großbuchstaben d verwenden .DataTable()(dies gibt ein Datatable API-Objekt zurück), verwenden Sie Folgendes:

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

Das ist @netbrain Antwort.

Wenn Sie datatable mit Kleinbuchstaben d verwenden .dataTable()(dies gibt ein jquery-Objekt zurück), verwenden Sie Folgendes:

 oTable.fnFilter($(this).val());
Zizoujab
quelle
4
oTable.fnFilter($(this).val());Arbeitete auch für mich,
shabeer90
10
Beide Methoden sind gültig, je nachdem, wie Sie die Datentabelle aufrufen: `oTable.search ($ (this) .val ()). Draw ();` Sie verwenden, wenn Sie sie aufrufen: .DataTable()und diese: oTable.fnFilter($(this).val());wenn Sie .dataTable() den Unterschied verwenden ist in der Hauptstadt D. Hoffe es hilft!
Lvkz
Gibt einen Fehler "oTable.fnFilter ist keine Funktion" für Datentabellen Version 1.10.5
Ege Bayrak
Ich habe gerade herausgefunden, dass Sie mit jQuery auch wie folgt auf die Datenbank-API zugreifen können: Dies oTable.api().search($(this).val()).draw();kann nützlich sein, insbesondere wenn Sie auch die Paginierung manuell steuern möchten length:oTable.api().page.len($(this).val()).draw();
Ghis
15

Sie können die sDomOption hierfür verwenden.

Standard mit Sucheingabe in einem eigenen div:

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

Wenn Sie die jQuery-Benutzeroberfläche verwenden (auf bjQueryUIeingestellt true):

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

Mit dem obigen Befehl wird das Such- / Filterelement mit einer Klasse namens außerhalb der eigentlichen Tabelle inputin ein eigenes Element eingefügt.divsearch-box

Obwohl es seine spezielle Kurzschrift-Syntax verwendet, kann es tatsächlich jeden HTML-Code verwenden, den Sie darauf werfen.

Mekwall
quelle
@Marcus: Eigentlich finde ich, dass sDom nicht ganz elegant zu bedienen ist, abgesehen von der Tatsache, dass wir das Suchfeld nicht vollständig anpassen können (in diesem Feld befindet sich ein Hardcode-Text "Suchen").
Hoàng Long
aber es ist immer noch in div.datatables_Wrapper, wie kann man es auch außerhalb von div.datatables_Wrapper verschieben?
Artur79
@ Artur79 Leider nein. Zumindest nicht ohne die Quelle von Datatables zu hacken.
Mekwall
2
<333 diese Syntax '<"search-box"r><"H"lf>t<"F"ip>'nicht sicher, ob etwas Schlimmeres existiert
Cristian E.
@ HoàngLong können Sie tatsächlich das Suchfeld mit folgenden Optionen anpassen:language: { search: "example", searchPlaceholder: "example" }
Flimm
8

Dieser hat mir bei DataTables Version 1.10.4 geholfen, weil es eine neue API gibt

var oTable = $('#myTable').DataTable();    
$('#myInputTextField').keyup(function(){
   oTable.search( $(this).val() ).draw();
})
Zimtbär
quelle
Beachten Sie das Großbuchstaben "D" von "var oTable = $ ('# myTable'). DataTable ();" ( datatables.net/faqs/#api )
Lionel
6

Neuere Versionen haben eine andere Syntax:

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

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

Beachten Sie, dass in diesem Beispiel die Variable verwendet wird, die tablebeim ersten Initialisieren von Datentabellen zugewiesen wurde. Wenn Sie diese Variable nicht zur Verfügung haben, verwenden Sie einfach:

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

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

Seit: DataTables 1.10

- Quelle: https://datatables.net/reference/api/search ()

Jonny
quelle
4

Dies sollte für Sie funktionieren: (DataTables 1.10.7)

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

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

oder

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

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

Ich hatte das gleiche Problem.

Ich habe alle Alternativen ausprobiert, aber keine Arbeit. Ich habe einen Weg gewählt, der nicht richtig ist, aber perfekt funktioniert hat.

Beispiel für eine Sucheingabe

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

der jquery-Code

$('#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();
});
Bruno Ribeiro
quelle
4

Ich möchte der Antwort von @ netbrain noch etwas hinzufügen, das für den Fall relevant ist, dass Sie die serverseitige Verarbeitung verwenden (siehe serverSide) Option ).

Die standardmäßig von Datentabellen durchgeführte Drosselung von Abfragen (siehe Option searchDelay ) gilt nicht für den .search()API-Aufruf. Sie können es mit $ .fn.dataTable.util.throttle () auf folgende Weise zurückerhalten :

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);
});
citxx
quelle
1

Sie können das div verschieben, wenn die Tabelle mit der fnDrawCallbackFunktion gezeichnet wird .

    $("#myTable").dataTable({
    "fnDrawCallback": function (oSettings) {
        $(".dataTables_filter").each(function () {
            $(this).appendTo($(this).parent().siblings(".panel-body"));
        });
    }
});
ebrown
quelle
Oder wenn Sie eine neuere Version von datatable verwenden, haben Sie:"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]); 
   }
});

In erhalten loadtransajax.phpSie möglicherweise den get-Wert:

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

Wenn Sie JQuery dataTable verwenden, müssen Sie nur hinzufügen "bFilter":true. Dies zeigt das Standardsuchfeld außerhalb der Tabelle an und funktioniert dynamisch. Wie erwartet

$("#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
        });    
Nikhil Thombare
quelle
Die Frage war, die Position des dynamisch erstellten zu ändern. Stellen Sie es AUSSERHALB des Tisches
MC