javascript - 使用 JavaScript 进行实时搜索时重新加载名称的问题

标签 javascript html css search

所以我试图做一个简单的搜索选项,而用户输入名称时,名称就会显示出来。但是,在我的代码中,只有当用户完全正确输入名称时,名称才会显示。基本上,我希望它显示与用户搜索相关的所有可用名称(如果用户

 const li = document.querySelectorAll("li");
    const input = document.querySelector("#search");
    const form = document.querySelector("form");
    const searchBtn = document.querySelector("button");
    const loopThrough = () => {
    	for (var i = 0; i < li.length; i++) {
    		if (input.value.toLowerCase() === li[i].innerText.toLowerCase()) {
    			li[i].style.display = "block";
    		}
    		if (li[i].style.display = "block" && input.value.toLowerCase().length == 0) {
    			li[i].style.display = "none";
    		}
    	}
    }
    input.addEventListener("keyup", loopThrough);
<form>
  <input type="search" id="search" placeholder="Search here...">
  <button type="button">Search</button>
</form>
	<ul>
		<li>Pierre</li>
		<li>Peter</li>
		<li>Philip</li>
		<li>Mazen</li>
		<li>Zeina</li>
		<li>Anna</li>
		<li>Wael</li>
		<li>Fadi</li>
		<li>Faris</li>
		<li>Walid</li>
	</ul> 

   

键入“p”,我希望所有以“p”开头的名字都显示出来。) 最初,在 CSS 中,所有 li display 属性都设置为 none

最佳答案

对于 JavaScript 和您拥有的文档来说,这是一件微不足道的事情。一些提示:

  • 忘记“keyup”,事实上所有明确的键盘事件。你在伤害自己和你的用户。并非所有设备都有键盘,Web 标准背后的聪明人早就预见到了这一点,并且每个文本输入控件都有可触发的“输入”和“更改”事件。
  • 您可以对每个“输入”或“更改”事件启动搜索,但如果您的搜索查询需要任何时间,您最好在每个“输入”时重置搜索超时 "事件至少相反——有些人打字速度非常快,应用程序方面没有必要为输入的每个字母运行搜索查询——在许多情况下,对于快速打字者来说,这将远远超过每秒 10 次搜索。浪费资源——重置超时,以便搜索在半秒左右后排队。该数字通常应该是用户的偏好,但这是大多数人不会理会的微小偏好,因此只需使用一些足够好的平均值即可。
  • 在这种情况下不要使用内联样式。它们很少是解决方案的合适部分。使用 CSS 类,以便可以在样式表中指定与您的搜索相匹配的元素的行为和样式。或者您可以使用 hidden 属性,它可能是合适的,具体取决于。

这是一些根据您的代码段改编的解决您问题的现成代码:

var timeout;
document.getElementById("form").elements.search.addEventListener("input", function(ev) {
    if(timeout) clearTimeout(timeout);
    timeout = setTimeout(function(input) {
        for(const li of document.querySelectorAll("li")) {
            li.classList.toggle("match", li.textContent.startsWith(input.value));
        }
    }, 500, ev.target);
});

关于javascript - 使用 JavaScript 进行实时搜索时重新加载名称的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53833897/

相关文章:

javascript - 等待过去的功能完成以开始新的功能

javascript - 有没有办法在 HTML5/CSS 中制作一个滚动的 "viewport"框?

javascript - Cypress - 如何访问位于 Shadow 元素内的 iFrame 内的按钮

javascript - 数字验证在 Firefox 中不起作用

html - z-index 不适用于绝对元素

html - 没有 jquery 水平居中模态

javascript - 如何在 React 中正确捕获 Materialize-CSS 日期选择器值?

javascript - 使用 JavaScript 将 2 个 TD 元素添加到表中

html - 网站在 IE7 中看起来正常,但在其他 IE 中不正常

javascript - 如何从 JavaScript 中的异步函数传递参数?