Dane - pole wyszukiwania poza datatable


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

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());

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.


@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();
})

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 ()


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

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

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

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

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 .= ')';
}

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

Chodziło o zmianę pozycji dynamicznie tworzonego. Wykładanie poza stół
MC
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.