JQuery - 根据文本框输入过滤嵌套列表

标签 jquery html list filter nested

我有一个嵌套的复选框列表,我需要根据文本框输入与标签值的比较来过滤它们。该列表如下所示,但要大得多:

enter image description here

fiddle :https://jsfiddle.net/y9qqgjp5/

但是,我在处理其中的嵌套部分时遇到了麻烦。正如我现在所拥有的,如果您去搜索用户(第二级项目),父级将被隐藏,因为它不匹配,从而使子级也被隐藏。它可以很好地对父级进行过滤。

这是我正在过滤的简化结构。

HTML:

<input type="text" id="filter" />
<span class="checkbox-list">
<ul>
    <li>
        <label>Item1</label>
        <ul>
            <li>
                <label>Item2</label>
            </li>
            <li>
                <label>Item3</label>
            </li>
            <li>
                <label>Item4</label>
            </li>
            <li>
                <label>Item5</label>
            </li>
        </ul>
    </li>
    <li>
        <label>Item6</label>
    </li>
    <li>
        <label>Item7</label>
        <ul>
            <li>
                <label>Item4</label>
            </li>
            <li>
                <label>Item8</label>
            </li>
        </ul>
    </li>
</ul>
</span>

JQuery:

$('#filter').keyup(function() {
  var valThis = $(this).val().toLowerCase();
  if (valThis == "") {
    $('.checkbox-list > ul > li > label').parent().show();
  } else {
    $('.checkbox-list > ul > li > label').each(function() {
      var text = $(this).text().toLowerCase();
      (text.indexOf(valThis) >= 0) ? $(this).parent().show(): $(this).parent().hide();
    });
  };

  if (valThis == "") {
    $('.checkbox-list > ul > li > ul > li > label').parent().show();
  } else {
    $('.checkbox-list > ul > li > > ul > li > label').each(function() {
      var text = $(this).text().toLowerCase();
      (text.indexOf(valThis) >= 0) ? $(this).parent().show(): $(this).parent().hide();
    });
  };
});

感谢任何帮助。我无法理解其中的嵌套部分。

最佳答案

尝试使用parents()

var labels = $('label');  // cache this for better performance

$('#filter').keyup(function() {
  var valThis = $(this).val().toLowerCase();
  
  if (valThis == "") {
    labels.parent().show();          // show all lis
  } else {
    labels.each(function() {
      var label = $(this);                    // cache this
      var text = label.text().toLowerCase();
      if (text.indexOf(valThis) > -1) {
        label.parents('li').show()           // show all li parents up the ancestor tree
      } else {
       label.parent().hide();                // hide current li as it doesn't match
      }
    });
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="filter" />
<span class="checkbox-list">
<ul>
    <li>
        <label>Item 1</label>
        <ul>
            <li>
                <label>Item 12</label>
            </li>
            <li>
                <label>Item3</label>
            </li>
            <li>
                <label>Item4</label>
            </li>
            <li>
                <label>Item5</label>
            </li>
        </ul>
    </li>
    <li>
        <label>Item6</label>
    </li>
    <li>
        <label>Item7</label>
        <ul>
            <li>
                <label>Item4</label>
            </li>
            <li>
                <label>Item8</label>
            </li>
        </ul>
    </li>
</ul>
</span>

关于JQuery - 根据文本框输入过滤嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48690039/

相关文章:

jquery - 使用 jQuery 播放 10 秒后的视频

jquery - 如何使用 Zend Framework 制作基于 AJAX 的 GUI

jquery - HTML5音频在jQuery中成功加载检查?

javascript - 为什么 slideToggle 会向下并超出屏幕?

python - 查找列表中段落的第一个单词

Javascript 从函数访问对象变量

jquery - 为什么我的 jquery 脚本在不同时间播放动画?

html - 我如何将我的链接置于我的下拉菜单中(里面的另一个查询)?

Python string.join(list) 对象数组而不是字符串数组

python - 将列表的每个元素插入到mysql python中的单独列中