【问题标题】:Filter multiple <ul> lists with jQuery使用 jQuery 过滤多个 <ul> 列表
【发布时间】:2012-03-11 14:48:31
【问题描述】:

我在一页上有多个列表(多个产品类别),如下所示:

<h3>Category 1</h3>
<ul id="category1">
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
</ul>
<h3>Category 2</h3>
<ul id="category2">
    <li>item27</li>
    <li>item28</li>
</ul>

列表的数量是可变的。

我想要一个过滤器,比如这里的演示页面http://static.railstips.org/orderedlist/demos/quicksilverjs/jquery.html

但它应该搜索不同的列表。

如果用户搜索“2”,那么结果应该是:

<h3>Category 1</h3>
<ul id="category1">
    <li>item2</li>
</ul>
<h3>Category 2</h3>
<ul id="category2">
    <li>item27</li>
    <li>item28</li>
</ul>

如果他搜索“1”,那么它应该是(不要在没有结果的列表中显示 h3 标题):

<h3>Category 1</h3>
<ul id="category1">
    <li>item1</li>
</ul>

有人可以帮我吗?

提前致谢!

【问题讨论】:

  • 目前有代码吗?你尝试过的东西等等。

标签: jquery filter html-lists multiple-instances


【解决方案1】:

这样的事情怎么样:

HTML

<input type="text" />

<ul id="category1">
    <li>item1</li>
    <li>item2</li>
    <li>item3</li>
</ul>
<ul>
    <li>item27</li>
    <li>item28</li>
</ul>

JS

$(function(){

    $('input[type="text"]').keyup(function(){

        var searchText = $(this).val();

        $('ul > li').each(function(){

            var currentLiText = $(this).text(),
                showCurrentLi = currentLiText.indexOf(searchText) !== -1;

            $(this).toggle(showCurrentLi);

        });     
    });

});

http://jsfiddle.net/EFTZR/146/

使用filter()的另一种解决方案,如下所述:

$('input[type="text"]').keyup(function(){

    var that = this, $allListElements = $('ul > li');

    var $matchingListElements = $allListElements.filter(function(i, li){
        var listItemText = $(li).text().toUpperCase(), 
            searchText = that.value.toUpperCase();
        return ~listItemText.indexOf(searchText);
    });

    $allListElements.hide();
    $matchingListElements.show();

});

http://jsfiddle.net/EFTZR/441/

【讨论】:

  • 看起来很壮观!我已经用要显示或不显示的 h3 标签更新了我的问题。你也可以帮我吗?无论如何感谢您的回答!
  • 将 .toLowerCase() 添加到文本值和比较使其与大写无关!
  • 谢谢,效果很好,如果您还可以添加 No results found 文本会很好,我使用this 来查找具有 display:block 样式的元素长度。如果长度为 0,则插入一个引导警报 div,如 $('.message').html(&lt;div class='alert alert-warning'&gt;)
  • return ~listItemText.indexOf(searchText); 中的~ 字符有什么作用?
【解决方案2】:

您可以使用 jQuery 中的过滤器方法来做到这一点:

var valueToSearch = "item1"; // this one should come from the search box
var allListItems = $("ul > li");
var filteredItems = allListItems.filter(function(index) {
    var listItemValue = $(this).text();
    var hasText = listItemValue.indexOf(valueToSearch) > -1;
    return hasText;
});

接下来,您可以使用 for 循环以列表或类似的方式显示 filtersItems 变量中的值。

【讨论】:

  • 您能否更改您的答案,以便它可以不区分大小写进行搜索?
  • @Alexandros 最简单的方法是var hasText = listItemValue.toLowerCase().indexOf(valueToSearch.toLowerCase()) &gt; -1;
  • 非常感谢@jesse-van-assen
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2022-11-19
  • 2018-08-20
  • 2015-04-05
相关资源
最近更新 更多