【问题标题】:JQuery Filter that shows closest li with img使用 img 显示最接近 li 的 JQuery 过滤器
【发布时间】:2015-02-13 21:16:18
【问题描述】:

我有一个包含许多列表项的列表,我想创建一个自定义过滤器,除了一个问题外,我几乎完成了该过滤器。在列表中,有不同的部分充当标题,如果该标题下有任何项目,则标题列表项也应显示。

这是列表的格式:

<ul id="forms-list">
   <li><a><img/></a></li> <-----This is a Header
   <li><a></a></li>
   <li><a></a></li>
   <li><a></a></li>
   <li><a></a></li>
   <li><a><img/></a></li> <-----This is a Header
   <li><a></a></li>
   <li><a></a></li>
   <li><a></a></li>
   <li><a></a></li>
</ul>

如果该标题下没有项目,则该标题应保持隐藏状态。

这是我目前拥有的代码:

$('#filter').keyup(function () {
    var rex = new RegExp($(this).val(), 'i');
    $('#forms-list li').hide();
    var $filtered = $('li').filter(function () {
        return rex.test($(this).text());
    });

    $filtered.each(function () {
        $(this).closest("li").has("img").show();
        $(this).show();
    });
});

【问题讨论】:

  • 有什么理由必须全部在 1 个列表中?

标签: javascript jquery html filter


【解决方案1】:

试试这个 (demo):

$('#filter').keyup(function () {
    var rex = new RegExp($(this).val(), 'i');
    $('#forms-list li').hide();
    var $filtered = $('li').filter(function () {
        return rex.test($(this).text());
    });

    $filtered.each(function () {
        $(this).prevUntil("li:has(img)").prev().show();
        $(this).show();
    });
});

【讨论】:

    【解决方案2】:

    可以更优化地完成,但这可能不会与您的原始代码有太多差异。如果可能的话,您只需要稍微不同地组织 html。如果您有数千个这样的过滤器,您可能希望在搜索时更加优化和简洁。

    http://jsfiddle.net/7tg39a9x/1/

    <input type="text" id="filter" />
    
    <ul class="filterable">
        <li class="header"><img src="http://icons.iconarchive.com/icons/famfamfam/silk/16/layout-header-icon.png" /> Header 1</li>
        <li>item</li>
        <li>item 2</li>
        <li>abc</li>
    </ul>
    
    <ul class="filterable">
        <li class="header"><img src="http://icons.iconarchive.com/icons/famfamfam/silk/16/layout-header-icon.png" /> Header 2</li>
        <li>item</li>
        <li>item 2</li>
        <li>abc</li>
    </ul>
    
    <ul class="filterable">
        <li class="header"><img src="http://icons.iconarchive.com/icons/famfamfam/silk/16/layout-header-icon.png" /> Header 3</li>
        <li>item</li>
        <li>item 2</li>
        <li>abc</li>
    </ul>
    

    还有一些脚本

    $(function() {
        $('#filter').keyup(function () {
            var rex = new RegExp($(this).val(), 'i');
            $('.filterable li').hide();
            var $filtered = $('li').filter(function () {
                return rex.test($(this).text());
            });
    
            $filtered.each(function () {
                $(this).show();
                $(this).parent().find('li').first().show();
            });
        });
    });
    

    【讨论】:

    • 谢谢劳伦斯!这也是一个非常好的方法。
    • 我不确定您的确切上下文是什么,但是作为标题的部分通常应该在语义上像它们一样处理,即 H1、H2 等......所以 html 重组会更好一些 - 但如果你不关心那些没关系的东西。 IE。搜索引擎通常不会加载 js 和 css 并解释原始文本,我相信因此如果这对您的情况很重要,使用正确的标签会有所帮助。
      schema.org/BlogPosting">

      人生的第一条规则

      ...
    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多