我想做一个搜索栏.无论我在搜索框中键入什么,结果都会显示"下拉列表",搜索时不会显示列表中的项目.我做错了什么?

var dropdown = document.getElementsByClassName("dropdown-btn");
var i;

for (i = 0; i < dropdown.length; i++) {
  dropdown[i].addEventListener("click", function() {
    this.classList.toggle("active");
    var dropdownContent = this.nextElementSibling;
    if (dropdownContent.style.display === "block") {
      dropdownContent.style.display = "none";
    } else {
      dropdownContent.style.display = "block";
    }
  });
}

function myFunction() {
  var input, filter, ul, li, a, i;
  input = document.getElementById("mySearch");
  filter = input.value.toUpperCase();
  ul = document.getElementById("myMenu");
  li = ul.getElementsByTagName("li");
  for (i = 0; i < li.length; i++) {
    a = li[i].getElementsByTagName("a")[0];
    if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {
      li[i].style.display = "";
    } else {
      li[i].style.display = "none";
    }
  }
}
<div class="sidenav">
  <input type="text" id="mySearch" onkeyup="myFunction()" placeholder="Search.." title="Type in a category">
  <ul id="myMenu">
    <li><a href="#about">About</a></li>
    <li><a href="#services">Services</a></li>
    <li><a href="#clients">Clients</a></li>
    <li><a href="#contact">Contact</a></li>
    <button class="dropdown-btn">Dropdown 
        <i class="fa fa-caret-down"></i>
      </button>
    <div class="dropdown-container">
      <li><a href="#">Link 1</a></li>
      <li><a href="#">Link 2</a></li>
      <li><a href="#">Link 3</a></li>
    </div>
    <li><a href="#contact">Search</a></li>
  </ul>
</div>

推荐答案

这是一个工作演示,演示了如何通过在输入文本上键入建议来实时过滤菜单项.

主要问题是使用正确的策略从dom中获取菜单项.你想参与过滤的元素不是<LI>个元素.

此外,您嵌入在下拉按钮中的列表没有包含在ol容器中,并且 destruct 了正确的行为.

我稍微重构了您的html,并重点关注了负责根据键入的输入过滤列表的单个js函数:

function f(filter){
  menuItems = document.querySelectorAll('#myMenu > li');
  for(const menuItem of menuItems){    
    const textContent = menuItem.textContent.trim().toUpperCase();
    //console.log(`"${textContent}" "${filter}" "${textContent.indexOf(filter)}"`);
    if (textContent.indexOf(filter.toUpperCase()) > -1) {
      menuItem.classList.remove('hidden');
    }else{
      menuItem.classList.add('hidden');      
    }        
  }
}
.hidden{
  display: none;
}
body {
  font-family: "Lato", sans-serif;
}

/* Fixed sidenav, full height */
.sidenav {
  height: 100%;
  width: 200px;
  position: fixed;
  z-index: 1;
  top: 0;
  left: 0;
  background-color: #111;
  overflow-x: hidden;
  padding-top: 20px;
}

/* Style the sidenav links and the dropdown button */
.sidenav a, .dropdown-btn {
  padding: 6px 8px 6px 16px;
  text-decoration: none;
  font-size: 20px;
  color: #818181;
  display: block;
  border: none;
  background: none;
  width: 100%;
  text-align: left;
  cursor: pointer;
  outline: none;
}

/* On mouse-over */
.sidenav a:hover, .dropdown-btn:hover {
  color: #f1f1f1;
}

/* Main content */
.main {
  margin-left: 200px; /* Same as the width of the sidenav */
  font-size: 20px; /* Increased text to enable scrolling */
  padding: 0px 10px;
}

/* Add an active class to the active dropdown button */
.active {
  background-color: green;
  color: white;
}

/* Dropdown container (hidden by default). Optional: add a lighter background color and some left padding to change the design of the dropdown content */
.dropdown-container {
  display: none;
  background-color: #262626;
  padding-left: 8px;
}

/* Optional: Style the caret down icon */
.fa-caret-down {
  float: right;
  padding-right: 8px;
}

/* Some media queries for responsiveness */
@media screen and (max-height: 450px) {
  .sidenav {padding-top: 15px;}
  .sidenav a {font-size: 18px;}
}
<div class="sidenav">
  
  <input type="text" id="mySearch" onkeyup="f(this.value)" placeholder="Search.." title="Type in a category">
  
  <ul id="myMenu">
    <li><a href="#about">About</a></li>
    <li><a href="#services">Services</a></li>
    <li><a href="#clients">Clients</a></li>
    <li><a href="#contact">Contact</a></li>
    <li>
      <button class="dropdown-btn">
        Dropdown
        <i class="fa fa-caret-down"></i>
      </button>
      <div class="dropdown-container">
        <ol>
          <li><a href="#">Link 1</a></li>
          <li><a href="#">Link 2</a></li>
          <li><a href="#">Link 3</a></li>
        </ol>
      </div>
    </li>    
    <li>
      <a href="#contact">Search</a>
    </li>
  </ul>
  
</div>

Javascript相关问答推荐

被CSS优先级所迷惑

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

在Java中寻找三次Bezier曲线上的点及其Angular

有条件重定向到移动子域

Puppeteer上每页的useProxy返回的不是函数/构造函数

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

如何在HTMX提示符中设置默认值?

有效路径同时显示有效路径组件和不存在的路径组件

将基元传递给THEN处理程序

判断函数参数的类型

如果NetSuite中为空,则限制筛选

我为什么要使用回调而不是等待?

通过解构/功能组件接收props-prop验证中缺少错误"

P5play SecurityError:无法从';窗口';读取命名属性';Add';:阻止具有源的帧访问跨源帧

React数组查找不读取变量

Played link-Initialize.js永远显示加载符号

如何创建一个for循环,用于计算仪器刻度长度并将其放入一个HTML表中?

调试jQuery代码以获取所有行的总和(票证类型)

此上下文在JavaScript中

我怎么才能拿到幼风登录?