paginar - tablas dinamicas html javascript
Cómo realizar una búsqueda en tiempo real y filtrar en una tabla HTML (8)
Estuve buscando en Google y buscando Stack Overflow por un tiempo, pero no puedo evitar este problema.
Tengo una tabla HTML estándar, que contiene, por ejemplo, fruta. Al igual que:
<table>
<tr>
<td>Apple</td>
<td>Green</td>
</tr>
<tr>
<td>Grapes</td>
<td>Green</td>
</tr>
<tr>
<td>Orange</td>
<td>Orange</td>
</tr>
</table>
Sobre esto tengo un cuadro de texto, que me gustaría buscar en la tabla a medida que el usuario escribe. Entonces, si escriben Gre
por ejemplo, la fila naranja de la tabla desaparece, dejando la manzana y las uvas. Si continuaban y escribían Green Gr
la fila de Apple desaparecería, dejando solo las uvas. Espero que esto esté claro.
Y, si el usuario eliminara parte o la totalidad de su consulta del cuadro de texto, me gustaría que reapareciesen todas las filas que ahora coinciden con la consulta.
Si bien sé cómo eliminar una fila de la tabla en jQuery, tengo poca idea sobre cómo hacer la búsqueda y eliminar las filas de forma selectiva en función de esto. ¿Hay una solución simple para esto? ¿O un plugin?
Si alguien pudiera señalarme en la dirección correcta, sería genial.
Gracias.
Solución pura de Javascript:
Funciona para TODAS las columnas y no distingue entre mayúsculas y minúsculas:
function search_table(){
// Declare variables
var input, filter, table, tr, td, i;
input = document.getElementById("search_field_input");
filter = input.value.toUpperCase();
table = document.getElementById("table_id");
tr = table.getElementsByTagName("tr");
// Loop through all table rows, and hide those who don''t match the search query
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td") ;
for(j=0 ; j<td.length ; j++)
{
let tdata = td[j] ;
if (tdata) {
if (tdata.innerHTML.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
break ;
} else {
tr[i].style.display = "none";
}
}
}
}
}
¡Gracias @dfsq por el código tan útil!
He hecho algunos ajustes y tal vez otros también les gusten. Me aseguré de que puedas buscar varias palabras sin tener una coincidencia estricta.
Filas de ejemplo:
- Manzanas y peras
- Manzanas y Plátanos
- Manzanas y naranjas
- ...
Podría buscar ''ap pe'' y reconocería la primera fila
Podría buscar ''banana apple'' y reconocería la segunda fila
Demostración: http://jsfiddle.net/JeroenSormani/xhpkfwgd/1/
var $rows = $(''#table tr'');
$(''#search'').keyup(function() {
var val = $.trim($(this).val()).replace(/ +/g, '' '').toLowerCase().split('' '');
$rows.hide().filter(function() {
var text = $(this).text().replace(//s+/g, '' '').toLowerCase();
var matchesSearch = true;
$(val).each(function(index, value) {
matchesSearch = (!matchesSearch) ? false : ~text.indexOf(value);
});
return matchesSearch;
}).show();
});
Aquí está la mejor solución para buscar dentro de la tabla HTML mientras cubre toda la tabla , (todos td, tr en la tabla), javascript puro y lo más breve posible:
<input id=''myInput'' onkeyup=''searchTable()'' type=''text''>
<table id=''myTable''>
<tr>
<td>Apple</td>
<td>Green</td>
</tr>
<tr>
<td>Grapes</td>
<td>Green</td>
</tr>
<tr>
<td>Orange</td>
<td>Orange</td>
</tr>
</table>
<script>
function searchTable() {
var input, filter, found, table, tr, td, i, j;
input = document.getElementById("myInput");
filter = input.value.toUpperCase();
table = document.getElementById("myTable");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td");
for (j = 0; j < td.length; j++) {
if (td[j].innerHTML.toUpperCase().indexOf(filter) > -1) {
found = true;
}
}
if (found) {
tr[i].style.display = "";
found = false;
} else {
tr[i].style.display = "none";
}
}
}
</script>
Creé estos ejemplos.
indexOf simple de búsqueda
var $rows = $(''#table tr'');
$(''#search'').keyup(function() {
var val = $.trim($(this).val()).replace(/ +/g, '' '').toLowerCase();
$rows.show().filter(function() {
var text = $(this).text().replace(//s+/g, '' '').toLowerCase();
return !~text.indexOf(val);
}).hide();
});
Demostración : http://jsfiddle.net/7BUmG/2/
Búsqueda de expresiones regulares
Una funcionalidad más avanzada que usa expresiones regulares le permitirá buscar palabras en cualquier orden en la fila. Funcionará igual si escribe apple green
o green apple
:
var $rows = $(''#table tr'');
$(''#search'').keyup(function() {
var val = ''^(?=.*//b'' + $.trim($(this).val()).split(//s+/).join(''//b)(?=.*//b'') + '').*$'',
reg = RegExp(val, ''i''),
text;
$rows.show().filter(function() {
text = $(this).text().replace(//s+/g, '' '');
return !reg.test(text);
}).hide();
});
Demostración : http://jsfiddle.net/dfsq/7BUmG/1133/
Rebote
Cuando implemente el filtrado de tablas con búsquedas en varias filas y columnas, es muy importante que considere el rendimiento y la velocidad / optimización de búsqueda. Simplemente diciendo que no debe ejecutar la función de búsqueda con cada pulsación de tecla, no es necesario. Para evitar que el filtrado se ejecute con demasiada frecuencia, debe evitar rebotarlo. El ejemplo del código anterior se convertirá en:
$(''#search'').keyup(debounce(function() {
var val = $.trim($(this).val()).replace(/ +/g, '' '').toLowerCase();
// etc...
}, 300));
Puede elegir cualquier implementación de rebote, por ejemplo desde Lodash _.debounce , o puede usar algo muy simple como el que uso en las próximas demostraciones (rebote desde here ): http://jsfiddle.net/7BUmG/6230/ y http://jsfiddle.net/7BUmG/6231/ .
Encontré la respuesta de dfsq sus comentarios extremadamente útiles. Hice algunas modificaciones menores aplicables a mí (y lo estoy publicando aquí, en caso de que sea de alguna utilidad para otros).
- Usar
class
como ganchos, en lugar de elementos de tablatr
- Búsqueda / comparación de texto dentro de una
class
secundaria mientras se muestra / oculta el elemento primario - Haciéndolo más eficiente almacenando los elementos de texto
$rows
en una matriz solo una vez (y evitando$rows.length
veces el cálculo)
var $rows = $(''.wrapper'');
var rowsTextArray = [];
var i = 0;
$.each($rows, function() {
rowsTextArray[i] = $(this).find(''.fruit'').text().replace(//s+/g, '' '').toLowerCase();
i++;
});
$(''#search'').keyup(function() {
var val = $.trim($(this).val()).replace(/ +/g, '' '').toLowerCase();
$rows.show().filter(function(index) {
return (rowsTextArray[index].indexOf(val) === -1);
}).hide();
});
span {
margin-right: 0.2em;
}
<input type="text" id="search" placeholder="type to search" />
<div class="wrapper"><span class="number">one</span><span class="fruit">apple</span></div>
<div class="wrapper"><span class="number">two</span><span class="fruit">banana</span></div>
<div class="wrapper"><span class="number">three</span><span class="fruit">cherry</span></div>
<div class="wrapper"><span class="number">four</span><span class="fruit">date</span></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
puedes usar Javascript nativo como este
<script>
function myFunction() {
var input, filter, table, tr, td, i;
input = document.getElementById("myInput");
filter = input.value.toUpperCase();
table = document.getElementById("myTable");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[0];
if (td) {
if (td.innerHTML.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
</script>
tengo un plugin jquery para esto. Utiliza jquery-ui también. Puedes ver un ejemplo aquí http://jsfiddle.net/tugrulorhan/fd8KB/1/
$("#searchContainer").gridSearch({
primaryAction: "search",
scrollDuration: 0,
searchBarAtBottom: false,
customScrollHeight: -35,
visible: {
before: true,
next: true,
filter: true,
unfilter: true
},
textVisible: {
before: true,
next: true,
filter: true,
unfilter: true
},
minCount: 2
});
El complemento Datatable JS es también una buena alternativa para accomedate la función de búsqueda para la tabla html
var table = $(''#example'').DataTable();
// #myInput is a <input type="text"> element
$(''#myInput'').on( ''keyup'', function () {
table.search( this.value ).draw();
} );
https://datatables.net/examples/basic_init/zero_configuration.html