Datatables - Zone de recherche hors datatable

117

J'utilise DataTables ( datatables.net ) et je voudrais que mon champ de recherche soit en dehors du tableau (par exemple dans mon en-tête div).

Est-ce possible ?

Athanasios Emmanouilidis
la source

Réponses:

240

Vous pouvez utiliser l'API DataTables pour filtrer la table. Donc, tout ce dont vous avez besoin est votre propre champ d'entrée avec un événement keyup qui déclenche la fonction de filtre vers DataTables. Avec css ou jquery, vous pouvez masquer / supprimer le champ d'entrée de recherche existant. Ou peut-être que DataTables a un paramètre pour le supprimer / ne pas l'inclure.

Consultez la documentation de l'API Datatables à ce sujet.

Exemple:

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
la source
8
Vous devriez certainement utiliser .keyup au lieu de .keypress, sinon vous rencontrerez un retard dans les résultats
Sævar
1
Je foiré avec la mise $(".dataTables_filter :input").focus().val(value).keypress();en keyupmon entrée pendant environ une heure, avant de trouver. Jamais cependant pour utiliser l'API .. Solution élégante!
MattSizzle
3
Le JS doit changer pour utiliser .search ($ (this) .val ()) .draw () à la place de fnFilter. Voir: datatables.net/manual/api#Chaining J'ai changé cette réponse pour la corriger, mais il semble qu'elle doit d'abord être examinée par les pairs.
Shane Grant
13
Remarque: Vous aurez toujours besoin de l'option "search: true", et vous voudrez probablement masquer la boîte de recherche par défaut, alors définissez simplement l'option sDOM sur null.
coup
8
L'instanciation de $ (). DataTable () avec un petit "d" renverra un objet jQuery plutôt qu'une instance d'API DataTables. Ce dernier peut être réalisé en appelant "oTable = $ ('# myTable'). DataTable ();" avec un "D" majuscule. Ceci est nécessaire pour pouvoir appeler .search dessus (si cela lancera une erreur "fonction non définie" sinon). Voir: datatables.net/faqs/#api
Lionel
34

Selon le commentaire de @lvkz:

si vous utilisez datatable avec d majuscule .DataTable()(cela retournera un objet API Datatable), utilisez ceci:

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

qui est la réponse @netbrain.

si vous utilisez datatable avec un d minuscule .dataTable()(cela retournera un objet jquery), utilisez ceci:

 oTable.fnFilter($(this).val());
zizoujab
la source
4
oTable.fnFilter($(this).val());A travaillé pour moi aussi,
shabeer90
10
Les deux méthodes sont valides, selon la façon dont vous appelez le datatable: `oTable.search ($ (this) .val ()). Draw ();` vous utilisez lorsque vous l'appelez: .DataTable()et celui-ci: oTable.fnFilter($(this).val());lorsque vous utilisez .dataTable() La différence est à la capitale D. J'espère que cela aide!
Lvkz
Donne une erreur "oTable.fnFilter is not a function" pour les tables de données version 1.10.5
Ege Bayrak
Je viens de penser qu'avec jQuery, vous pouvez également accéder à l'API de base de données comme ceci: oTable.api().search($(this).val()).draw();cela peut être utile, surtout si vous voulez également un contrôle manuel de la pagination length:oTable.api().page.len($(this).val()).draw();
Ghis
15

Vous pouvez utiliser l' sDomoption pour cela.

Par défaut avec l'entrée de recherche dans son propre div:

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

Si vous utilisez jQuery UI ( bjQueryUIdéfini sur true):

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

Ce qui précède mettra l' inputélément de recherche / filtrage dans son propre divavec une classe nommée search-boxqui est en dehors de la table réelle.

Même s'il utilise sa syntaxe abrégée spéciale, il peut en fait prendre n'importe quel HTML que vous lui lancez.

mekwall
la source
@Marcus: en fait, je pense que sDom n'est pas tout à fait élégant à utiliser, mis à part le fait que nous ne pouvons pas entièrement personnaliser le champ de recherche (il y a un texte "Recherche" en dur dans ce champ).
Hoàng Long
mais il est toujours à l'intérieur de div.datatables_Wrapper, un moyen de le déplacer en dehors de celui-ci également?
Artur79
@ Artur79 Malheureusement non. Pas sans pirater la source des Datatables, au moins.
mekwall
2
<333 cette syntaxe '<"search-box"r><"H"lf>t<"F"ip>'ne sait pas si quelque chose de pire existe
Cristian E.
@ HoàngLong, vous pouvez en fait personnaliser le champ de recherche en utilisant des options comme celle-ci:language: { search: "example", searchPlaceholder: "example" }
Flimm le
8

Celui-ci m'a aidé pour DataTables Version 1.10.4, car sa nouvelle API

var oTable = $('#myTable').DataTable();    
$('#myInputTextField').keyup(function(){
   oTable.search( $(this).val() ).draw();
})
cannelle
la source
Notez le "D" majuscule de "var oTable = $ ('# myTable'). DataTable ();" ( datatables.net/faqs/#api )
Lionel
6

Les versions plus récentes ont une syntaxe différente:

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

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

Notez que cet exemple utilise la variable tableaffectée lors de la première initialisation des tables de données. Si vous n'avez pas cette variable disponible, utilisez simplement:

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

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

Depuis: DataTables 1.10

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

Jonny
la source
4

Cela devrait fonctionner pour vous: (DataTables 1.10.7)

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

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

ou

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

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

J'ai eu le même problème.

J'ai essayé toutes les alternatives affichées, mais pas de travail, j'ai utilisé un moyen qui n'est pas correct mais qui a parfaitement fonctionné.

Exemple d'entrée de recherche

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

le code 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
la source
4

Je veux ajouter une autre chose à la réponse de @ netbrain pertinente au cas où vous utilisez le traitement côté serveur (voir serverSide option ).

La limitation des requêtes effectuée par défaut par les tables de données (voir l' option searchDelay ) ne s'applique pas à l' .search()appel d'API. Vous pouvez le récupérer en utilisant $ .fn.dataTable.util.throttle () de la manière suivante:

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
la source
1

Vous pouvez déplacer le div lorsque le tableau est dessiné à l'aide de la fnDrawCallbackfonction.

    $("#myTable").dataTable({
    "fnDrawCallback": function (oSettings) {
        $(".dataTables_filter").each(function () {
            $(this).appendTo($(this).parent().siblings(".panel-body"));
        });
    }
});
ebrown
la source
Ou si vous utilisez une version plus récente de datatable, vous aurez:"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]); 
   }
});

Dans loadtransajax.phpvous pouvez recevoir la valeur get:

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

Si vous utilisez JQuery dataTable, vous devez simplement ajouter "bFilter":true. Cela affichera la zone de recherche par défaut en dehors de la table et son fonctionnement de manière dynamique..comme prévu

$("#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
la source
La question était de changer la position de la création dynamique. Mettre hors de la table
MC