我有一个来自Keyup filter multiple lists with headers with jQuery的html列表的过滤器。问题是,一旦你输入了一个不在列表中的错误单词/字符,它就会中断,并且在你从输入框中完全删除/删除它之前不会工作。有没有办法修复原始代码,即使你只是退格并删除错误的字符后它仍然有效?
http://jsfiddle.net/thesystemrestart/zzG4f/5/
HTML:
<ul id="workflow_books">
<li>
<h6 class="custom"> Custom Books</h6>
<ul>
<li class="custom-books">
<a>Don't see your book in our list? Add it yourself!</a>
</li>
</ul>
</li>
<li>
<h6>Academic</h6>
<ul>
<li>
<a>Academic Book One</a>
</li>
<li>
<a>Academic Book Two</a>
</li>
</ul>
</li>
<li>
<h6>Botany</h6>
<ul>
<li>
<a>Botany Book One</a>
</li>
<li>
<a>Botany Book Two</a>
</li>
</ul>
</li>
</ul>
JQuery的
var $products = $('#workflow_books li ul');
$("#search").keyup(function() {
var val = this.value.trim();
if (!val) $('li:hidden', '#workflow_books').show();
else {
$('li:hidden', $products).show();
$('li', $products).filter(function() {
var re = new RegExp(val, 'ig');
return !re.test($('a', this).text());
}).hide();
$products.each(function() {
if ($('li:visible', this).length == 0) $(this).parent('li').hide();
else $(this).parent('li').show();
});
}
});
我真的很感激任何帮助。感谢。
答案 0 :(得分:0)
问题是这一行:
$('li:hidden', $products).show();
如果父母被隐藏,不会显示父母,所以这一行:
if ($('li:visible', this).length == 0)
隐藏父级时,永远不会为假。
我的主要变化是我在上面发布的第一行:
$('li:hidden', '#workflow_books').show();
工作小提琴:http://jsfiddle.net/hKv8h/
var $products = $('#workflow_books li ul:not(:first)');
$("#search").keyup(function() {
var val = this.value.trim();
$('li:hidden', '#workflow_books').show();
if (val) {
$('li:hidden', '#workflow_books').show();
$('li', $products).filter(function() {
var re = new RegExp(val, 'ig');
return !re.test($('a', this).text());
}).hide();
$products.each(function() {
if ($('li:visible', this).length == 0)
$(this).parent('li').hide();
else
$(this).parent('li').show();
});
}
});