Мне кажется, проблема в том, что вы перебираете все элементы списка с помощью:
$("#list li").each(function() {
, а затем на каждой итерации вы перебираете список слов с помощью:
$.each(inputWords, function(i, a_filter) {
, а затем во внутреннем цикле вы снова обрабатываете все li элементов с помощью:
var containing = $('#list li').filter(function () {
Итак, во внутренней части вы запутываетесь простос чем ты имеешь дело.Я думаю, что вам нужно выполнить цикл по каждому элементу, проверить, нет ли у него совпадений со списком входных слов, а затем спрятать или показать этот элемент соответствующим образом.Примерно так:
var inputWords = inputValue.toLowerCase().split(/[\s,]+/);
$("#list li").each(function() {
var matches = false,
$currentElement = $(this);
$.each(inputWords, function(i, a_filter) {
if ($.trim(a_filter)==="") return; // skip blank items
var regex = new RegExp('\\b(' + a_filter + ')(s|es|\'s)?\\b', 'i');
if (regex.test($currentElement.text())) {
matches = true;
return false; // return false breaks out of the $.each
// (no need to continue once a match is found)
}
});
if (matches)
$currentElement.slideDown(400);
else
$currentElement.slideUp();
});
Рабочая демонстрация: http://jsfiddle.net/QhL2M/19/
РЕДАКТИРОВАТЬ: также способ, которым вы разделяли список входных слов, не работал для меня:
var inputWords = $('.filterinput').text().toLowerCase().split(/[\s,]+/);
// I've changed that to
var inputWords = inputValue.toLowerCase().split(/[\s,]+/);
Вы не хотите использовать .text()
на входе, и в любом случае inputValue
уже был инициализирован ранее для хранения текста этого ввода.Мой код выше и демо были обновлены.