2 votes

Datatables : recherche par colonne avec HTML dépouillé

Référencement aux tables de données API .

J'ai implémenté la recherche par colonne individuelle et j'ai besoin de l'étendre : Il y a une colonne qui affiche un bouton avec des attributs/classes HTML appliqués. Le problème : je dois supprimer le HTML afin de rechercher uniquement la légende du bouton. Avez-vous une idée de la façon dont je peux le faire ?

Voici mon code :

table().every(function () {
    var that = this;
    $('input', this.footer()).on('keyup change', function (e) {
        if (e.which == 27) {
            $(this).val('');
        }
        if (that.search() !== this.value) {
            that.search(this.value).draw();
        }
    });
});

3voto

U25lYWt5IEJhc3RhcmQg Points 2255

Je crois que vous devez utiliser une fonction de recherche externe (personnalisée). $.fn.DataTable.ext.search afin de ne rechercher que les textes des boutons (si c'est ce que vous cherchez à faire).

Vous pouvez trouver le Démonstration ci-dessous :

//Sample source data
const srcData=[
    {title:'apple',cat:'fruit',score:'good'},
    {title:'strawberry',cat:'berry',score:'good'},
    {title:'broccoli',cat:'vegie',score:'bad'},
    {title:'durian',cat:'fruit',score:'bad'}
];
//Global variable for button text custom search
var buttonText = '';
//DataTables initialization
const dataTable = $('#mytable').DataTable({
        dom: 't',
        data: srcData,
        columns: [
            {title: 'title', data: 'title'}, 
            {title: 'category', data: 'cat'},
            //render score property as a button
            {title: 'score', data: 'score', render: (data, type, row, meta) => `<button>${data == 'good' ? 'Love it!' : 'Hate it!'}</button>`}
        ],
    });
//Append <tfoot> and searchbars
$('#mytable').append('<tfoot><tr></tr></tfoot>');
dataTable.columns().every(function () {
    $('#mytable tfoot tr').append(`<td><input colindex="${this.index()}"></input></td>`);
});
//Custom search function across button text only
$.fn.DataTable.ext.search.push((settings, row, rowIndex, rowData, counter) => $(dataTable.row(rowIndex).node()).find('td:eq(2) button').text().toLowerCase().includes(buttonText) || buttonText == '');
//Listen for 'keyup' in <tfoot> searchbars
$('#mytable').on('keyup', 'tfoot td input', function () {
    const colindex = $(this).attr('colindex');
    //If it's input in 3-rd column (colindex==2) 
    //simply assign global variabl and re-draw 
    //table to apply custom search
    if (colindex == 2) buttonText = $(this).val().toLowerCase();
    //Otherwise search by corresponding column
    else dataTable.column(colindex).search($(this).val());
    dataTable.draw();
});

tfoot td {
  padding-left: 10px !important
}

<!doctype html>
<html>
<head>
  <script type="application/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <script type="application/javascript" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
</head>
<body>
<table id="mytable"></table>
</body>
</html>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X