Dane - pole wyszukiwania poza datatable

117

Używam DataTables ( datatables.net ) i chciałbym, aby moje pole wyszukiwania znajdowało się poza tabelą (na przykład w moim div nagłówka).

Czy to możliwe ?

Athanasios Emmanouilidis
źródło

Odpowiedzi:

240

Do filtrowania tabeli można użyć interfejsu API DataTables. Więc wszystko, czego potrzebujesz, to własne pole wejściowe ze zdarzeniem keyup, które wyzwala funkcję filtru do DataTables. Za pomocą css lub jquery możesz ukryć / usunąć istniejące pole wyszukiwania. A może DataTables ma ustawienie umożliwiające jego usunięcie / niewłączenie.

Zapoznaj się z dokumentacją interfejsu Datatables API na ten temat.

Przykład:

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() ;
})
netbrain
źródło
8
Zdecydowanie powinieneś użyć .keyup zamiast .keypress, w przeciwnym razie wystąpi opóźnienie w wynikach
Sævar
1
I pomieszane z wprowadzeniem $(".dataTables_filter :input").focus().val(value).keypress();w keyupdniu mojego wejścia na około godzinę przed znalezieniem tego. Jednak nigdy nie korzystaj z API… Eleganckie rozwiązanie!
MattSizzle
3
JS musi się zmienić, aby używał .search ($ (this) .val ()) .draw () zamiast fnFilter. Zobacz: datatables.net/manual/api#Chaining Zmieniłem tę odpowiedź, aby to naprawić, ale wygląda na to, że najpierw trzeba ją zweryfikować.
Shane Grant
13
Uwaga: Nadal będziesz potrzebować opcji "search: true", a potem prawdopodobnie będziesz chciał ukryć domyślne pole wyszukiwania, więc po prostu ustaw opcję sDOM na null.
huk
8
Utworzenie wystąpienia $ (). DataTable () z małym „d” zwróci obiekt jQuery, a nie instancję interfejsu API DataTables. To drugie można osiągnąć, wywołując "oTable = $ ('# myTable'). DataTable ();" przez duże „D”. Jest to wymagane, aby móc wywołać na nim .search (w przeciwnym razie zgłosi błąd „function undefined”). Zobacz: datatables.net/faqs/#api
Lionel
34

Zgodnie z komentarzem @lvkz:

jeśli używasz datatable z wielką .DataTable()literą d (zwróci to obiekt Datatable API), użyj tego:

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

czyli odpowiedź @netbrain.

jeśli używasz datatable z małą literą d .dataTable()(zwróci to obiekt jquery), użyj tego:

 oTable.fnFilter($(this).val());
zizoujab
źródło
4
oTable.fnFilter($(this).val());Dla mnie też pracował,
shabeer90
10
Obie metody są poprawne, w zależności od tego, jak wywołujesz datatable: `oTable.search ($ (this) .val ()). Draw ();` używasz, kiedy to wywołujesz: .DataTable()i ta: oTable.fnFilter($(this).val());kiedy używasz .dataTable() Różnica jest w stolicy D. Mam nadzieję, że to pomaga!
Lvkz
Daje błąd „oTable.fnFilter nie jest funkcją” dla danych w wersji 1.10.5
Ege Bayrak
Po prostu pomyślałem, że z jQuery możesz również uzyskać dostęp do API bazy danych w następujący sposób: oTable.api().search($(this).val()).draw();Może to być przydatne, szczególnie jeśli chcesz również ręcznie kontrolować paginację length:oTable.api().page.len($(this).val()).draw();
Ghis
15

Możesz użyć sDomdo tego opcji.

Domyślnie z wejściem wyszukiwania we własnym div:

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

Jeśli używasz interfejsu użytkownika jQuery ( bjQueryUIustawiony na true):

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

Powyższe spowoduje umieszczenie elementu wyszukiwania / filtrującego inputwe własnym divz klasą o nazwie, search-boxktóra znajduje się poza rzeczywistą tabelą.

Mimo że używa swojej specjalnej skróconej składni, może faktycznie przyjąć dowolny HTML, który do niego rzucisz.

mekwall
źródło
@Marcus: tak naprawdę uważam, że sDom nie jest zbyt elegancki w użyciu, pomijając fakt, że nie możemy w pełni dostosować pola wyszukiwania (w tym polu znajduje się stały kod "Wyszukaj").
Hoàng Long
ale nadal znajduje się w div.datatables_Wrapper, jakikolwiek sposób, aby przenieść go również poza niego?
Artur79
@ Artur79 Niestety nie. Przynajmniej nie bez włamania się do źródła danych.
mekwall
2
<333 ta składnia '<"search-box"r><"H"lf>t<"F"ip>'nie jest pewna, czy istnieje coś gorszego
Cristian E.
@ HoàngDługo możesz dostosować pole wyszukiwania za pomocą takich opcji:language: { search: "example", searchPlaceholder: "example" }
Flimm,
8

Ten pomógł mi w przypadku DataTables w wersji 1.10.4, ponieważ jego nowy interfejs API

var oTable = $('#myTable').DataTable();    
$('#myInputTextField').keyup(function(){
   oTable.search( $(this).val() ).draw();
})
cynamonowiec
źródło
Zwróć uwagę na duże „D” w „var oTable = $ ('# myTable'). DataTable ();" ( datatables.net/faqs/#api )
Lionel
6

Nowsze wersje mają inną składnię:

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

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

Należy zauważyć, że w tym przykładzie użyto zmiennej tableprzypisanej podczas pierwszej inicjalizacji zbiorów danych. Jeśli nie masz dostępnej tej zmiennej, po prostu użyj:

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

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

Od: DataTables 1.10

- Źródło: https://datatables.net/reference/api/search ()

Jonny
źródło
4

To powinno działać dla Ciebie: (DataTables 1.10.7)

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

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

lub

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

$('#myInputTextField').on('keyup change', function(){
  oTable.search($(this).val()).draw();
})
Sky Yip
źródło
4

Miałem ten sam problem.

Wypróbowałem wszystkie opublikowane alternatywy, ale bez pracy, użyłem niewłaściwego sposobu, ale działał idealnie.

Przykładowe hasło wyszukiwania

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

kod 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();
});
Bruno Ribeiro
źródło
4

Chcę dodać jeszcze jedną rzecz do odpowiedzi @ netbrain, istotną w przypadku korzystania z przetwarzania po stronie serwera (patrz serverSide opcja ).

Ograniczanie zapytań wykonywane domyślnie przez dane (patrz opcja searchDelay ) nie ma zastosowania do .search()wywołania API. Możesz go odzyskać, używając $ .fn.dataTable.util.throttle () w następujący sposób:

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
źródło
1

Możesz przenieść element div podczas rysowania tabeli za pomocą fnDrawCallbackfunkcji.

    $("#myTable").dataTable({
    "fnDrawCallback": function (oSettings) {
        $(".dataTables_filter").each(function () {
            $(this).appendTo($(this).parent().siblings(".panel-body"));
        });
    }
});
ebrown
źródło
Lub jeśli używasz nowszej wersji datatable, będziesz mieć:"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]); 
   }
});

W loadtransajax.phpmożesz otrzymać wartość get:

if ($_GET['text_min_val']){
    $sWhere = "WHERE ("; 
    $sWhere .= " t_group_no LIKE '%" . mysql_real_escape_string($_GET['text_min_val']) . "%' ";
    $sWhere .= ')';
}
Senanayaka
źródło
0

Jeśli używasz JQuery dataTable, musisz po prostu dodać "bFilter":true. Spowoduje to wyświetlenie domyślnego pola wyszukiwania poza tabelą i działa dynamicznie zgodnie z oczekiwaniami

$("#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
źródło
Chodziło o zmianę pozycji dynamicznie tworzonego. Wykładanie poza stół
MC