0

jQuery で keyup のヘッダー (カテゴリ名) で複数のリスト (特定のカテゴリの書籍) をフィルタリングしようとしています。リスト内のアイテム (特定の本) のみをフィルター検索したいのですが、ヘッダーはフィルター処理しません。リストが空の場合、ヘッダー (カテゴリ名) は表示されなくなります。これまでのところ、複数のリストをフィルタリングすることはできますが、リストが空の場合、ヘッダーは消えません。また、フィルターから .custom-books リストを除外したいと思います。

HTML:

<input type="text" id="search" />

<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 li a')

$("#search").keyup(function() {
    $products.show().filter(function() {
        return !re.test($(this).text());
    }).hide();
})

何か案は?

ありがとう、ハイファイブ!マイク

4

2 に答える 2

1
var $products = $('#workflow_books li ul:not(:first)');
$("#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();
        });
    }
});

ワーキングデモ

于 2012-05-16T20:43:57.417 に答える
0

これで、最初のリストを無視して、文字列の先頭でそれらをフィルタリングします。もっと具体的なことが必要な場合はお知らせください。

var $products = $('#workflow_books ul:not(:first)');

$("#search").keyup(function() {
    var input = this.value;    

    $products.each(function() {
        var $this = $(this),
            $matches = $this.children('li').filter(function() {

                return $(this).children('a').text().toLowerCase().indexOf(input) === 0;
            });

        if($matches.length > 0) {
            $this.children().hide();
            $this.parent().show(); 
            $matches.show();            
        } else {
         $this.parent().hide();   
        }
    });
})​;​
于 2012-05-16T20:40:09.487 に答える