首页 > 解决方案 > javascript 嵌套 ul li > ul li 搜索

问题描述

我从 w3schools 获得了如下代码。但是我的列表中有嵌套的 ul。这里的代码不起作用。如何使此代码适应嵌套的 ul li?

w3schools 代码:

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

<h2>My Phonebook</h2>

<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names.." title="Type in a name">

<ul id="myUL">
  <li><a href="#">Adele</a></li>
  <li><a href="#">Agnes</a></li>

  <li><a href="#">Billy</a></li>
  <li><a href="#">Bob</a></li>

  <li><a href="#">Calvin</a></li>
  <li><a href="#">Christina</a></li>
  <li><a href="#">Cindy</a></li>
</ul>

<script>
function myFunction() {
    var input, filter, ul, li, a, i, txtValue;
    input = document.getElementById("myInput");
    filter = input.value.toUpperCase();
    ul = document.getElementById("myUL");
    li = ul.getElementsByTagName("li");
    for (i = 0; i < li.length; i++) {
        a = li[i].getElementsByTagName("a")[0];
        txtValue = a.textContent || a.innerText;
        if (txtValue.toUpperCase().indexOf(filter) > -1) {
            li[i].style.display = "";
        } else {
            li[i].style.display = "none";
        }
    }
}
</script>

</body>
</html>

我的列表:

<ul id="myUL">
    <li>
        <a href="#">Adele</a>
        <ul>
            <li>
                <a href="#">Mariam</a>
                <ul>
                    <li>
                        <a href="#">Andreas</a>
                    </li>
                    <li>
                        <a href="#">Dimitru</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#">Agnes</a></li>
    <li><a href="#">Billy</a></li>
    <li>
      <a href="#">Bob</a>
      <ul>
          <li>
              <a href="#">Alexander</a>
          </li>
      </ul>
    </li>
    <li><a href="#">Calvin</a></li>
    <li><a href="#">Christina</a></li>
    <li><a href="#">Cindy</a></li>
</ul>

如您所见,我的列表中嵌套了多个 ul - li。所以搜索系统不工作。我该如何运行它?你在条目上写一个名字。过滤您键入的名称是否在列表中。但是嵌套的 ul -li 不会被过滤掉。我也希望过滤嵌套的 ul -li 。

标签: javascripthtmljquerysearch

解决方案


您不能使用display:none属性,因为它隐藏了li并且它是子 li,您可以使用可见性代替,检查以下内容:

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>

<h2>My Phonebook</h2>

<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search for names.." title="Type in a name">

<ul id="myUL">
    <li>
        <a href="#">Adele</a>
        <ul>
            <li>
                <a href="#">Mariam</a>
                <ul>
                    <li>
                        <a href="#">Andreas</a>
                    </li>
                    <li>
                        <a href="#">Dimitru</a>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#">Agnes</a></li>
    <li><a href="#">Billy</a></li>
    <li>
      <a href="#">Bob</a>
      <ul>
          <li>
              <a href="#">Alexander</a>
          </li>
      </ul>
    </li>
    <li><a href="#">Calvin</a></li>
    <li><a href="#">Christina</a></li>
    <li><a href="#">Cindy</a></li>
</ul>

<script>
function myFunction() {
    var input, filter, ul, li, a, i, txtValue;
    input = document.getElementById("myInput");
    filter = input.value.toUpperCase();
    ul = document.getElementById("myUL");
    li = document.querySelectorAll('li');
    
    for (i = 0; i < li.length; i++) {
        a = li[i].getElementsByTagName("a")[0];
        txtValue = a.textContent || a.innerText;
        if (txtValue.toUpperCase().indexOf(filter) > -1) {
            li[i].style.visibility = "visible";
        } else {
            li[i].style.visibility = "hidden";
        }
    }

}
</script>

</body>
</html>

推荐阅读