#javascript #jquery #search #replace #filtering
#javascript #jquery #Поиск #заменить #фильтрация
Вопрос:
Я применил фильтры jQuery к таблице с несколькими сотнями строк, и она отлично работает.
Но я хочу создать несколько ссылок HTML в верхней части таблицы, чтобы пользователи могли щелкнуть по этой ссылке, чтобы применить фильтр (вместо ввода), например. Перечислите все записи с названием города Вашингтон, что-то вроде этого:
Желаемая фильтрация
<a href="">List all records with city name Washington</a>
Вот код:
$(document).ready(function() {
$("#myInput").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#myTable tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
});
});
});
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td,
th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<h2>Desired Filtering</h2>
<h3><a href="">List all records with city name Washington</a></h3>
<hr />
<h2>Working Filterable Table</h2>
<p>Type something in the input field to search the table for first names, last names or emails:</p>
<input id="myInput" type="text" placeholder="Search..">
<br><br>
<table>
<thead>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Email</th>
<th>City</th>
</tr>
</thead>
<tbody id="myTable">
<tr>
<td>John</td>
<td>Doe</td>
<td>john@example.com</td>
<td>New York</td>
</tr>
<tr>
<td>Mary</td>
<td>Moe</td>
<td>mary@mail.com</td>
<td>Washington</td>
</tr>
<tr>
<td>July</td>
<td>Dooley</td>
<td>july@greatstuff.com</td>
<td>New York</td>
</tr>
<tr>
<td>Anja</td>
<td>Ravendale</td>
<td>a_r@test.com</td>
<td>New York</td>
</tr>
<tr>
<td>Mathew</td>
<td>Stars</td>
<td>a_z@test.com</td>
<td>Washintgon</td>
</tr>
</tbody>
</table>
Ответ №1:
таким образом, пользователи могут нажать на эту ссылку, чтобы применить фильтр (вместо ввода)
Вы можете сохранить нужный фильтр в ссылке, используя data-
атрибут, а затем применить его к вводимым данным поиска с помощью .val()
.
<a href="#" class='addfilter' data-filter="washington">List all records with city name Washington</a>
$(".addfilter").click(function() {
var filter = $(this).data("filter");
$("#myInput").val(filter);
$("#myInput").trigger("keyup");
return false;
});
Здесь я присвоил ссылке класс addfilter
, чтобы вы могли добавлять новые ссылки без необходимости изменять код. .click
Обработчик имеет return false;
(или мог бы использовать .preventDefault
, чтобы остановить <a>
переход ( href='#'
также останавливает <a>
изменение всей страницы).
Обновленный фрагмент:
$("#myInput").on("keyup", function() {
var value = $(this).val().toLowerCase();
$("#myTable tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
});
});
$(".addfilter").click(function() {
var filter = $(this).data("filter");
$("#myInput").val(filter);
$("#myInput").trigger("keyup");
return false;
});
table {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
td,
th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
tr:nth-child(even) {
background-color: #dddddd;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<h2>Desired Filtering</h2>
<h3>
<a href="#" class='addfilter' data-filter="washington">List all records with city name Washington</a>
<br/>
<a href="#" class='addfilter' data-filter="new york">List all records with city name New York</a></h3>
<hr />
<h2>Working Filterable Table</h2>
<p>Type something in the input field to search the table for first names, last names or emails:</p>
<input id="myInput" type="text" placeholder="Search..">
<br><br>
<table>
<thead>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Email</th>
<th>City</th>
</tr>
</thead>
<tbody id="myTable">
<tr>
<td>John</td>
<td>Doe</td>
<td>john@example.com</td>
<td>New York</td>
</tr>
<tr>
<td>Mary</td>
<td>Moe</td>
<td>mary@mail.com</td>
<td>Washington</td>
</tr>
<tr>
<td>July</td>
<td>Dooley</td>
<td>july@greatstuff.com</td>
<td>New York</td>
</tr>
<tr>
<td>Anja</td>
<td>Ravendale</td>
<td>a_r@test.com</td>
<td>New York</td>
</tr>
<tr>
<td>Mathew</td>
<td>Stars</td>
<td>a_z@test.com</td>
<td>Washintgon</td>
</tr>
</tbody>
</table>
Для приведенного выше, чтобы «применить» фильтр, я использовал .trigger("keyup")
который вызывает ваш существующий код. Это делается для того, чтобы свести количество изменений к минимуму; на практике вы хотели бы использовать это в своей собственной функции. Вы также можете использовать input
вместо keyup
, поскольку он будет перехватывать вставку мыши и т.д., Выдавая что-то вроде:
function applyFilter(value) {
value = value.toLowerCase();
$("#myTable tr").filter(function() {
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
});
}
$(".addfilter").click(function() {
var filter = $(this).data("filter");
$("#myInput").val(filter);
applyFilter(filter);
return false;
});
$("#myInput").on("input", function() {
var value = $(this).val();
applyFilter(value);
});
Комментарии:
1. Большое спасибо… это именно то, что я искал. Пожалуйста, укажите далее, возможно ли ссылаться на эти «html-ссылки на этой странице» с другой страницы, скажем … этот фрагмент кода работает над page-1.html могу ли я создать ссылку на page-2.html что-то вроде… вашингтон> Посмотреть весь список Вашингтона здесь</a>
2. Конечно, в doc.ready проверьте окно. location.search — есть подробные методы извлечения точного параметра в других ответах на SO — затем поместите это в #myInput и примените фильтр.