Taking the HTML code from the page you link to (and you should include in your question) I can reproduce your problem.
In your code the decision is made by checking the last cell of each row because with each check you decide on the status of visible or not of the entire row, so the last check of each row is the one that prevails.
It can be solved in the following way:
/* Obtenemos todas las celdas de la fila, no sólo la primera */
td = tr[i].getElementsByTagName("td");
for (j = 0; j < td.length; j++) {
/* Si el texto coincide marcamos la fila como que debe quedar visible */
if (td[j] && td[j].innerHTML.toUpperCase().indexOf(filter) > -1) {
visible = true;
}
}
/* Si alguna de las celdas marcó la fila como visible la mostramos */
if (visible === true) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
As you can see initially I guess the row can not be displayed, visible
is worth false
, but later I look for all the cells of that row and if some match the text then I change the state of visible
to true
so that when you finish checking all the cells you decide to hide or not the entire row.
The complete code:
function myFunction() {
// Declare variables
var input, filter, table, tr, td, i, j, visible;
input = document.getElementById("myInput");
filter = input.value.toUpperCase();
table = document.getElementById("myTable");
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++) {
visible = false;
/* Obtenemos todas las celdas de la fila, no sólo la primera */
td = tr[i].getElementsByTagName("td");
for (j = 0; j < td.length; j++) {
if (td[j] && td[j].innerHTML.toUpperCase().indexOf(filter) > -1) {
visible = true;
}
}
if (visible === true) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
#myInput {
background-image: url('/css/searchicon.png'); /* Add a search icon to input */
background-position: 10px 12px; /* Position the search icon */
background-repeat: no-repeat; /* Do not repeat the icon image */
width: 100%; /* Full-width */
font-size: 16px; /* Increase font-size */
padding: 12px 20px 12px 40px; /* Add some padding */
border: 1px solid #ddd; /* Add a grey border */
margin-bottom: 12px; /* Add some space below the input */
}
#myTable {
border-collapse: collapse; /* Collapse borders */
width: 100%; /* Full-width */
border: 1px solid #ddd; /* Add a grey border */
font-size: 18px; /* Increase font-size */
}
#myTable th, #myTable td {
text-align: left; /* Left-align text */
padding: 12px; /* Add padding */
}
#myTable tr {
/* Add a bottom border to all table rows */
border-bottom: 1px solid #ddd;
}
#myTable tr.header, #myTable tr:hover {
/* Add a grey background color to the table header and on hover */
background-color: #f1f1f1;
}
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names..">
<table id="myTable">
<tr class="w3-light-grey">
<th style="width:60%;">Name</th>
<th style="width:40%;">Country</th>
</tr>
<tr>
<td>Alfreds Futterkiste</td>
<td>Germany</td>
</tr>
<tr>
<td>Berglunds snabbkop</td>
<td>Sweden</td>
</tr>
<tr>
<td>Island Trading</td>
<td>UK</td>
</tr>
<tr>
<td>Koniglich Essen</td>
<td>Germany</td>
</tr>
<tr>
<td>Laughing Bacchus Winecellars</td>
<td>Canada</td>
</tr>
<tr>
<td>Magazzini Alimentari Riuniti</td>
<td>Italy</td>
</tr>
<tr>
<td>North/South</td>
<td>UK</td>
</tr>
<tr>
<td>Paris specialites</td>
<td>France</td>
</tr>
</table>
PS: Beware that in your code this loop seems to be wrong:
for(var j = 0; i < 2; j++)