Tabelas de dados - caixa de pesquisa fora da tabela de dados

117

Estou usando DataTables ( datatables.net ) e gostaria que minha caixa de pesquisa estivesse fora da tabela (por exemplo, em meu div de cabeçalho).

Isso é possível ?

Athanasios Emmanouilidis
fonte

Respostas:

240

Você pode usar a API DataTables para filtrar a tabela. Portanto, tudo o que você precisa é do seu próprio campo de entrada com um evento keyup que acione a função de filtro para DataTables. Com css ou jquery você pode ocultar / remover o campo de entrada de pesquisa existente. Ou talvez DataTables tenha uma configuração para remover / não incluí-lo.

Verifique a documentação da API Datatables sobre isso.

Exemplo:

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
fonte
8
Definitivamente, você deve usar .keyup em vez de .keypress, caso contrário, haverá um atraso nos resultados
Sævar
1
Eu mexei em colocar $(".dataTables_filter :input").focus().val(value).keypress();na keyupminha entrada por cerca de uma hora, antes de encontrar isso. Nunca pensei em usar a API .. Solução elegante!
MattSizzle
3
O JS precisa mudar para usar .search ($ (this) .val ()) .draw () no lugar de fnFilter. Veja: datatables.net/manual/api#Chaining Eu mudei esta resposta para consertar, mas parece que primeiro precisa ser revisado por pares.
Shane Grant
13
Observação: Você ainda precisará da opção "search: true" e provavelmente deseja ocultar a caixa de pesquisa padrão, então apenas defina a opção sDOM como null.
bang
8
Instanciar $ (). DataTable () com um pequeno "d" retornará um objeto jQuery em vez de uma instância da API DataTables. O último pode ser alcançado chamando "oTable = $ ('# myTable'). DataTable ();" com um "D" maiúsculo. Isso é necessário para poder chamar .search nele (caso contrário, ele lançará um erro de "função indefinida"). Veja: datatables.net/faqs/#api
Lionel
34

De acordo com o comentário @lvkz:

se você estiver usando uma tabela de dados com d maiúsculo .DataTable()(isso retornará um objeto da API Datatable), use isto:

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

que é a resposta @netbrain.

se você estiver usando tabela de dados com d minúsculo .dataTable()(isso retornará um objeto jquery), use isto:

 oTable.fnFilter($(this).val());
zizoujab
fonte
4
oTable.fnFilter($(this).val());Funcionou para mim também,
shabeer90
10
Ambos os métodos são válidos, dependendo de como você está chamando a tabela de dados: `oTable.search ($ (this) .val ()). Draw ();` você usa quando você chama: .DataTable()e este: oTable.fnFilter($(this).val());quando você usa .dataTable() A diferença fica na capital D. Espero que ajude!
Lvkz
Fornece um erro "oTable.fnFilter não é uma função" para as tabelas de dados versão 1.10.5
Ege Bayrak
Apenas percebi que com o jQuery você também pode acessar a API do banco de dados assim: oTable.api().search($(this).val()).draw();Pode ser útil, especialmente se você quiser controle manual sobre a paginação lengthtambém:oTable.api().page.len($(this).val()).draw();
Ghis
15

Você pode usar a sDomopção para isso.

Padrão com entrada de pesquisa em seu próprio div:

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

Se você usar jQuery UI ( bjQueryUIdefinido como true):

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

O exemplo acima irá colocar o inputelemento de pesquisa / filtragem em seu próprio, divcom uma classe nomeada search-boxque está fora da tabela real.

Mesmo que ele use sua sintaxe abreviada especial, ele pode, na verdade, aceitar qualquer HTML que você jogar nele.

mekwall
fonte
@Marcus: na verdade, acho que o sDom não é muito elegante de usar, deixe de lado o fato de que não podemos personalizar totalmente a caixa de pesquisa (há um texto "Pesquisar" no código fixo nessa caixa).
Hoàng Long
mas ainda está dentro de div.datatables_Wrapper, há alguma maneira de movê-lo para fora dele também?
Artur79 de
@ Artur79 Infelizmente não. Não sem hackear a fonte dos Datatables, pelo menos.
mekwall de
2
<333 esta sintaxe '<"search-box"r><"H"lf>t<"F"ip>'não tem certeza se algo pior existe
Cristian E.
@ HoàngLong você pode personalizar a caixa de pesquisa usando opções como esta:language: { search: "example", searchPlaceholder: "example" }
Flimm
8

Este me ajudou para DataTables Versão 1.10.4, porque sua nova API

var oTable = $('#myTable').DataTable();    
$('#myInputTextField').keyup(function(){
   oTable.search( $(this).val() ).draw();
})
urso-canela
fonte
Observe o "D" maiúsculo de "var oTable = $ ('# myTable'). DataTable ();" ( datatables.net/faqs/#api )
Lionel
6

As versões mais recentes têm uma sintaxe diferente:

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

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

Observe que este exemplo usa a variável tableatribuída quando as tabelas de dados são inicializadas pela primeira vez. Se você não tiver essa variável disponível, basta usar:

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

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

Desde: DataTables 1.10

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

Jonny
fonte
4

Isso deve funcionar para você: (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();
})
Sky Yip
fonte
4

Eu tive o mesmo problema.

Tentei todas as alternativas postadas, mas não deu certo, usei um caminho que não está certo mas funcionou perfeitamente.

Exemplo de entrada de pesquisa

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

o código 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
fonte
4

Quero acrescentar mais uma coisa à resposta do @netbrain relevante no caso de você usar o processamento do lado do servidor (ver serverSide opção ).

A limitação de consulta executada por padrão por tabelas de dados (consulte a opção searchDelay ) não se aplica à .search()chamada de API. Você pode recuperá-lo usando $ .fn.dataTable.util.throttle () da seguinte maneira:

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
fonte
1

Você pode mover o div quando a tabela é desenhada usando a fnDrawCallbackfunção.

    $("#myTable").dataTable({
    "fnDrawCallback": function (oSettings) {
        $(".dataTables_filter").each(function () {
            $(this).appendTo($(this).parent().siblings(".panel-body"));
        });
    }
});
Ebrown
fonte
Ou se você usar uma versão mais recente da tabela de dados, você terá:"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]); 
   }
});

Em loadtransajax.phpvocê pode receber o valor get:

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

Se você estiver usando JQuery dataTable, então você precisa apenas adicionar "bFilter":true. Isso exibirá a caixa de pesquisa padrão fora da tabela e funciona dinamicamente .. conforme o esperado

$("#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
fonte
A questão era mudar a posição do criado dinamicamente. Colocando FORA da mesa
MC