Datatables - Casella di ricerca fuori datatable


Risposte:


240

È possibile utilizzare l'API DataTables per filtrare la tabella. Quindi tutto ciò di cui hai bisogno è il tuo campo di input con un evento keyup che attiva la funzione di filtro su DataTables. Con css o jquery puoi nascondere / rimuovere il campo di input di ricerca esistente. O forse DataTables ha un'impostazione per rimuoverlo / non includerlo.

Controlla la documentazione dell'API Datatables su questo.

Esempio:

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
Dovresti assolutamente usare .keyup invece di .keypress, altrimenti si verificherà un ritardo nei risultati
Sævar,

1
Ho incasinato inserendo $(".dataTables_filter :input").focus().val(value).keypress();il keyupmio input per circa un'ora, prima di trovare questo. Mai però usare l'API .. Soluzione elegante!
MattSizzle

3
JS deve essere modificato per utilizzare .search ($ (this) .val ()) .draw () al posto di fnFilter. Vedi: datatables.net/manual/api#Chaining Ho cambiato questa risposta per risolverlo, ma sembra che debba prima essere sottoposto a peer review.
Shane Grant

13
Nota: Avrai ancora bisogno dell'opzione "ricerca: true" e quindi probabilmente vorrai nascondere la casella di ricerca predefinita, quindi imposta l'opzione sDOM su null.
bang

8
L'istanza di $ (). DataTable () con una piccola "d" restituirà un oggetto jQuery anziché un'istanza API DataTables. Quest'ultimo può essere ottenuto chiamando "oTable = $ ('# myTable'). DataTable ();" con la "D" maiuscola. Questo è necessario per poter chiamare .search su di esso (altrimenti verrà generato un errore di "funzione non definita"). Vedi: datatables.net/faqs/#api
Lionel

34

Come da commento @lvkz:

se stai usando datatable con d maiuscola .DataTable()(questo restituirà un oggetto API Datatable) usa questo:

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

che è la risposta di @netbrain.

se stai usando datatable con d minuscola .dataTable()(questo restituirà un oggetto jquery) usa questo:

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

4
oTable.fnFilter($(this).val());Ha funzionato anche per me,
shabeer90

10
Entrambi i metodi sono validi, a seconda di come stai chiamando il datatable: `oTable.search ($ (this) .val ()). Draw ();` che usi quando lo chiami: .DataTable()e questo: oTable.fnFilter($(this).val());quando usi .dataTable() La differenza è nella capitale D. Spero che aiuti!
Lvkz

Fornisce un errore "oTable.fnFilter non è una funzione" per i datatables versione 1.10.5
Ege Bayrak

Ho appena pensato che con jQuery puoi anche accedere all'API del database in questo modo: oTable.api().search($(this).val()).draw();può essere utile, soprattutto se desideri anche il controllo manuale dell'impaginazione length:oTable.api().page.len($(this).val()).draw();
Ghis

15

Puoi usare l' sDomopzione per questo.

Predefinito con input di ricerca nel proprio div:

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

Se utilizzi jQuery UI ( bjQueryUIimpostato su true):

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

Quanto sopra inserirà l' inputelemento di ricerca / filtro nel proprio divcon una classe denominata search-boxche è al di fuori della tabella effettiva.

Anche se usa la sua speciale sintassi abbreviata, può effettivamente accettare qualsiasi HTML che gli lanci.


@ Marcus: in realtà credo che sDom non sia abbastanza elegante da usare, a parte il fatto che non possiamo personalizzare completamente la casella di ricerca (c'è un testo "Cerca" hardcode in quella casella).
Hoàng Long,

ma è ancora all'interno di div.datatables_Wrapper, un modo per spostarlo anche fuori?
Artur79

@ Artur79 Purtroppo no. Non senza aver hackerato la fonte di Datatables, almeno.
mekwall

2
<333 questa sintassi '<"search-box"r><"H"lf>t<"F"ip>'non è sicura se esista qualcosa di peggio
Cristian E.

@ HoàngLong in realtà puoi personalizzare la casella di ricerca utilizzando opzioni come questa:language: { search: "example", searchPlaceholder: "example" }
Flimm

8

Questo mi ha aiutato per DataTables versione 1.10.4, perché la sua nuova API

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

Nota la "D" maiuscola di "var oTable = $ ('# myTable'). DataTable ();" ( datatables.net/faqs/#api )
Lionel

6

Le versioni più recenti hanno una sintassi diversa:

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

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

Si noti che questo esempio utilizza la variabile tableassegnata quando i dati vengono inizializzati per la prima volta. Se non hai questa variabile disponibile, usa semplicemente:

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

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

Da: DataTables 1.10

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


4

Questo dovrebbe funzionare per te: (DataTables 1.10.7)

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

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

o

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

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

4

Ho avuto lo stesso problema.

Ho provato tutte le alternative postate, ma nessun lavoro, ho usato un modo che non è giusto ma ha funzionato perfettamente.

Esempio di input di ricerca

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

il codice 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

Voglio aggiungere un'altra cosa alla risposta di @ netbrain rilevante nel caso in cui utilizzi l'elaborazione lato server (vedi l' opzione serverSide ).

La limitazione delle query eseguita per impostazione predefinita dai datatables (vedere l' opzione searchDelay ) non si applica alla .search()chiamata API. Puoi recuperarlo usando $ .fn.dataTable.util.throttle () nel modo seguente:

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

Puoi spostare il div quando la tabella viene disegnata usando la fnDrawCallbackfunzione.

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

Oppure, se utilizzi una versione più recente di datatable, avrai:"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 loadtransajax.phppotresti ricevere il valore get:

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

0

Se stai usando JQuery dataTable, devi solo aggiungere "bFilter":true. Questo mostrerà la casella di ricerca predefinita fuori dalla tabella e funzionerà in modo dinamico .. come previsto

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

La domanda era cambiare la posizione del creato dinamicamente. Mettendolo FUORI dal tavolo
MC
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.