Datatable'lar - Datatable dışında Arama Kutusu


Yanıtlar:


240

Tabloyu filtrelemek için DataTables api'sini kullanabilirsiniz. Dolayısıyla, ihtiyacınız olan tek şey, DataTables'a filtre işlevini tetikleyen bir keyup olayına sahip kendi giriş alanınızdır. Css veya jquery ile mevcut arama giriş alanını gizleyebilir / kaldırabilirsiniz. Ya da DataTables'ın onu kaldırmak / dahil etmemek için bir ayarı vardır.

Bununla ilgili Datatables API belgelerine göz atın.

Misal:

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
Kesinlikle .keypress yerine .keyup kullanmalısınız, aksi takdirde sonuçlarda bir gecikme yaşarsınız
Sævar

1
Ben koyarak ile haberci $(".dataTables_filter :input").focus().val(value).keypress();de keyupbu bulmadan, yaklaşık bir saat boyunca benim girişinde. API kullanmayı asla düşünmeyin .. Zarif çözüm!
MattSizzle

3
JS'nin fnFilter yerine .search ($ (this) .val ()) .draw () kullanacak şekilde değiştirilmesi gerekiyor. Bakınız: datatables.net/manual/api#Chaining Bu yanıtı düzeltmek için değiştirdim, ancak ilk önce hakem tarafından incelenmesi gerekiyor gibi görünüyor.
Shane Grant

13
Not: Hala "arama: doğru" seçeneğine ihtiyacınız olacak ve muhtemelen varsayılan arama kutusunu gizlemek isteyeceksiniz, bu nedenle sDOM seçeneğini null olarak ayarlayın.
patlama

8
$ (). DataTable () 'ın küçük bir "d" ile örneklenmesi, DataTables API örneği yerine bir jQuery nesnesi döndürür. İkincisi, "oTable = $ ('# myTable'). DataTable ();" çağrılarak elde edilebilir. büyük "D" ile. Bu, .search'ü çağırabilmek için gereklidir (aksi takdirde "işlev tanımsız" hatası verirse). Bakınız: datatables.net/faqs/#api
Lionel

34

@Lvkz yorumuna göre:

d büyük harfli datatable kullanıyorsanız .DataTable()(bu bir Datatable API nesnesi döndürür) şunu kullanın:

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

@netbrain cevabı.

d küçük harfli datatable kullanıyorsanız .dataTable()(bu bir jquery nesnesi döndürür) şunu kullanın:

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

4
oTable.fnFilter($(this).val());Benim için de çalıştı,
shabeer90

10
Datatable'ı nasıl çağırdığınıza bağlı olarak her iki yöntem de geçerlidir: `oTable.search ($ (this) .val ()). Draw ();` onu çağırdığınızda kullanırsınız: .DataTable()ve bu: Farkı oTable.fnFilter($(this).val());kullandığınızda .dataTable()başkent D'de. Umarım yardımcı olur!
Lvkz

Veri tabloları sürüm 1.10.5 için "oTable.fnFilter bir işlev değil" hatası veriyor
Ege Bayrak

Sadece jQuery ile Veritabanı API'sına şu şekilde erişebileceğinizi düşündüm: oTable.api().search($(this).val()).draw();Özellikle sayfalandırma üzerinde manuel kontrol istiyorsanız yararlı olabilir length:oTable.api().page.len($(this).val()).draw();
Ghis

15

Bunun için sDomseçeneği kullanabilirsiniz .

Kendi bölmesinde arama girişi ile varsayılan:

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

JQuery UI kullanıyorsanız (olarak bjQueryUIayarlayın true):

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

Yukarıdakiler, arama / filtreleme inputelemanını , gerçek tablonun dışında olan divbir sınıfla kendi içine koyacaktır search-box.

Özel kısaltma sözdizimini kullanmasına rağmen, attığınız herhangi bir HTML'yi gerçekten alabilir.


@Marcus: Aslında sDom'un kullanımının pek de zarif olmadığını düşünüyorum, arama kutusunu tam olarak özelleştiremeyeceğimizi bir kenara bırakın (bu kutuda bir "Arama" metni var).
Hoàng Long

ama yine de div.datatables_Wrapper içinde, onun dışına da taşımanın bir yolu var mı?
Artur79

@ Artur79 Ne yazık ki hayır. En azından Veri Tablolarının kaynağını hacklemeden olmaz.
mekwall

2
<333 bu sözdizimi '<"search-box"r><"H"lf>t<"F"ip>'daha kötü bir şey olup olmadığından emin değil
Cristian E.

@ HoàngLong, aşağıdaki gibi seçenekleri kullanarak arama kutusunu gerçekten özelleştirebilirsiniz:language: { search: "example", searchPlaceholder: "example" }
Flimm

8

Bu, DataTables Sürüm 1.10.4 için bana yardımcı oldu, çünkü yeni API

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

"Var oTable = $ ('# myTable'). DataTable ();" öğesinin büyük "D" harfine dikkat edin. ( datatables.net/faqs/#api )
Lionel

6

Daha yeni sürümlerin farklı bir sözdizimi vardır:

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

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

Bu örnekte, tableveriler ilk kez başlatıldığında atanan değişkeni kullandığına dikkat edin . Bu değişkene sahip değilseniz, basitçe kullanın:

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

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

Beri: DataTables 1.10

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


4

Bu sizin için çalışmalıdır: (DataTables 1.10.7)

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

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

veya

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

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

4

Ben de aynı sorunu yaşadım.

Gönderilen tüm alternatifleri denedim ama iş yok, doğru olmayan bir yol kullandım ama mükemmel çalıştı.

Örnek arama girişi

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

jquery kodu

$('#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

Sunucu tarafı işlemeyi kullanmanız durumunda @ netbrain'in cevabına bir şey daha eklemek istiyorum (bkz. ServerSide seçeneği).

Veri tabloları tarafından varsayılan olarak gerçekleştirilen sorgu azaltma (bkz. SearchDelay seçeneği), .search()API çağrısı için geçerli değildir . $ .Fn.dataTable.util.throttle () 'ı aşağıdaki şekilde kullanarak geri alabilirsiniz :

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

fnDrawCallbackFonksiyon kullanılarak tablo çizildiğinde div'i taşıyabilirsiniz .

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

Veya datatable'ın daha yeni bir sürümünü kullanıyorsanız şunlara sahip olacaksınız:"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]); 
   }
});

İçinde loadtransajax.phpget değeri alabilirsiniz:

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

0

JQuery dataTable kullanıyorsanız, sadece eklemeniz gerekir "bFilter":true. Bu, tablo dışındaki varsayılan arama kutusunu ve çalışmalarını dinamik olarak gösterecektir .. beklendiği gibi

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

Soru, dinamik olarak yaratılanın konumunu değiştirmekti. Masanın DIŞINA Koymak
MC
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.