【问题标题】:How to hide the List items from Search Filter, when search input field is cleared?清除搜索输入字段后,如何从搜索过滤器中隐藏列表项?
【发布时间】:2017-07-12 10:26:51
【问题描述】:

我有一个这样的 HTML 列表项:

<ul id="fruits">
 <li><a href="#">Mango</a></li>
 <li><a href="#">Apple</a></li>
 <li><a href="#">Grape</a></li>
 <li><a href="#">Cherry</a></li>
</ul>

用户将看不到这些项目,因为我们用样式display: none; 隐藏了它们。 用户可以从input字段下方搜索这些项目:

<input type="text" id="searchInput" onkeyup="fruitSearch()" placeholder="Search fruits">

当用户开始在input 字段上搜索水果名称时,它将列出匹配的名称,就像谷歌搜索建议一样。 使用下面的 JavaScript 进行搜索:

function fruitSearch() {
    // Declare variables
    var input, filter, ul, li, a, i;
    input = document.getElementById('searchInput');
    filter = input.value.toUpperCase();
    ul = document.getElementById("fruits");
    li = ul.getElementsByTagName('li');

    // Loop through all list items, and show those who match the search query
    for (i = 0; i < li.length; i++) {
        a = li[i].getElementsByTagName("a")[0];
        if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {
            li[i].style.display = "block";
        } else {
            li[i].style.display = "none";
        }
    }
}

直到这里,一切都按设计和预期工作,一旦用户清除输入字段,所有水果列表项&lt;li&gt; 现在都可见而不是隐藏。

当用户清除input 字段时,如何重置列表项并将它们全部隐藏?

https://jsfiddle.net/kingBethal/cjbwomof/

【问题讨论】:

  • 先测试你输入的值,如果它为空则做一个特殊情况。在这种特殊情况下,将它们全部隐藏..
  • 即使更改为 ,您的搜索也无法正常工作。
  • 听起来您正在尝试实现数据列表已经可以在不编码的情况下实现的目标。 w3schools.com/tags/tag_datalist.asp 是否可取取决于我想您需要的浏览器支持。
  • @HemaNandagopal 它不起作用,因为他在他的&lt;li&gt; 标签中缺少&lt;a&gt; 标签,我已经在我的回答中解释了这一点。
  • 是的,看到了 :) 我发布它是因为 OP 说它按预期工作,所以。

标签: javascript jquery html


【解决方案1】:

首先你需要改变你的html。您需要在 &lt;li&gt; 标记中添加 &lt;a&gt;,因为在您的 javascript 代码中,您从 &lt;a&gt; 元素获取内容。

<ul id="fruits">
 <li><a href="#">Mango</a></li>
 <li><a href="#">Apple</a></li>
 <li><a href="#">Grape</a></li>
 <li><a href="#">Cherry</a></li>
</ul>

然后你可以做一个条件来检查输入的长度是否大于一

function fruitSearch() {
    // Declare variables
    var input, filter, ul, li, a, i;
    input = document.getElementById('searchInput');
    filter = input.value.toUpperCase();
    ul = document.getElementById("fruits");
    li = ul.getElementsByTagName('li');

    if(input.value.length == 0){
        ul.style.display = "none";
        return;
    }else{
        ul.style.display = "block";
    }
    // Loop through all list items, and hide those who don't match the search query
    for (i = 0; i < li.length; i++) {
        a = li[i].getElementsByTagName("a")[0];
        if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {
            li[i].style.display = "block";
        } else {
            li[i].style.display = "none";
        }
    }
}

这里有一个工作的jsfiddle

【讨论】:

    【解决方案2】:

    用 if 语句开始你的函数来检查值是否是 "" 然后根据那个决定你是否必须完成其余的代码

    var input, filter, ul, li, a, i;
     input = document.getElementById('searchInput');
     if (input.value==''){
     document.getElementById("fruits").style.display='none';
     }
     else{
     // the rest of the function
     }
    

    【讨论】:

      【解决方案3】:

      提示:您应该添加事件侦听器而不是使用内联事件。

          if (document.GetElementById('searchInput').value == '')
          {
              for (i = 0; i < li.length; i++)
              {
                  li[i].style.display = none;
              }
          } else {
              // REST OF CODE
          }
      

      因为您的函数会在每个 KeyUp 事件上被调用,只需将 函数内的 if 语句将起作用。

      【讨论】:

        【解决方案4】:

        您可以使用 JQuery keyup 来获取实时区分大小写的搜索。并使用showhide,可以显示相关结果。以下是更新后的代码:

        $("#searchInput").on('keyup', function() {
          var searchValue = $(this).val();
          searchAndFilter(searchValue)
        });
        
        function searchAndFilter(searchTerm) {
          if (searchTerm == '') {
            $("#fruits li").hide()
          } else {
            $("#fruits li").each(function() {
              var currentText = $(this).text();
              currentText = currentText.toUpperCase();
              searchTerm = searchTerm.toUpperCase();
              if (currentText.indexOf(searchTerm) >= 0) {
                $(this).show();
              }
            });
          }
        }
        
        $(document).ready(function() {
          $("#fruits li").hide();
        });
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <input type="text" id="searchInput" placeholder="Search fruits">
        
        <ul id="fruits">
          <li>Mango</li>
          <li>Apple</li>
          <li>Grape</li>
          <li>Cherry</li>
        </ul>

        【讨论】:

        • 首先它不起作用!其次,当问题全部在纯 javascript 中时,您正在使用 JQuery
        • 什么不起作用?其次,这个问题被标记为 JQuery。
        • 你的回答完全错误。当用户搜索时,它不显示答案,因为它区分大小写。当输入为空时,更重要的结果不会隐藏:)
        • 如果你好奇如何在这里修复它,你有一个 jsfiddle jsfiddle.net/tnw586h4/9
        • @edisoni.1337。伟大的。我会尝试使用这个 jQuery 而不是 JS
        【解决方案5】:

        您显然是从 w3schools 获得的,这意味着您确实复制了粘贴。您应该对其进行更多编辑,因为 w3schools 中的那个在开头和结尾都显示了所有项目。所以最好的解决方案是添加这样的 if...else 语句:

            if(input.value.length === false) {
                ul.style.display = "none"
            } else {
                ul.style.display = "block"
            }
        

        或者,您可以使用 switch 语句。

        【讨论】:

        • 请查看@edison-biba 3 年前接受的答案。问题不在于复制粘贴的代码,而是针对代码中的错误元素。
        猜你喜欢
        • 1970-01-01
        • 2019-02-03
        • 1970-01-01
        • 2020-12-12
        • 1970-01-01
        • 2017-11-10
        • 1970-01-01
        • 2021-07-09
        • 2018-05-08
        相关资源
        最近更新 更多