web-dev-qa-db-ja.com

jQueryで複数の<ul>リストをフィルタリングする

1ページに複数のリスト(製品の複数のカテゴリ)があります:

<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>

誰かが私を助けることができますか?

前もって感謝します!

16
Dante

このようなものはどうですか:

[〜#〜] 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/

48
Johan

これは、jQueryのfilterメソッドを使用して実行できます。

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ループを使用して、filteredItems変数の値をリストなどに表示できます。

2
Jesse van Assen