Это выглядит очень неэффективно, если у вас есть большой набор контактов для отображения. Самый простой способ - использовать jQuery и связать функцию с событием keyup вашего текстового поля: (при условии, что приведенный выше код содержится внутри чего-то вроде <div id="contactlist">
)
var searchstring = "";
function filterContact() {
var jthis = $(this); // should give a tiny performance gain
if ($('span.contactItem', this).text().toLowerCase().indexOf(searchstring) >= 0) {
jthis.addClass('matching');
jthis.removeClass('nonmatching');
} else {
jthis.addClass('nonmatching');
jthis.removeClass('matching');
}
}
function filterContacts() {
var elem = $('input#yourtextfield')[0];
searchstring = elem.value.toLowerCase(); // because we like to match all cases
searchstring = searchstring.replace(/^\s+/,'').replace(/\s+$/,''); // trim
$('#contactlist div').each(filterContact);
}
function initFiltering() {
$('input#yourtextfield').live('keyup',filterContacts);
}
$(document).ready(initFiltering);
Также добавьте классы .matching
и .nonmatching
в ваш CSS. (display: block
и none
)
Как уже говорилось, это довольно неэффективно, не только из-за необходимой памяти (и пропускной способности), но и из-за времени ЦП на фильтрацию (плюс время рендеринга). Это может быть быстрее, если вы обрабатываете эти данные внутри какого-либо массива или если у вас очень большие наборы данных, вы должны извлекать отфильтрованные данные, разбитые на страницы с сервера по требованию (это также можно сделать с помощью функций jJuery AJAX). Вы также можете отфильтровать задержку, если пользователь все еще печатает (фильтр, только если он перестал печатать на ~ 500 мс).
toLowerCase()
могут возникнуть некоторые трудности с вводом не-ASCII; поэтому, если вам это нужно, вы должны протестировать его на целевых языках.