JavaScript实现搜索框实时过滤与高亮显示列表项

JavaScript实现搜索框实时过滤与高亮显示列表项

本文详细介绍了如何使用javascripthtmlcss实现一个动态搜索功能。通过监听搜索框输入事件,实时过滤html列表(`

`)中的数据,并高亮显示所有匹配的关键词。该教程涵盖了前端交互逻辑、样式设计和dom操作,旨在帮助开发者构建用户友好的搜索体验。

动态搜索与高亮显示列表项教程

在现代Web应用中,为用户提供高效的数据检索和展示功能至关重要。本文将指导您如何创建一个交互式搜索框,该搜索框能够实时过滤HTML列表中的内容,并高亮显示所有匹配的关键词,从而显著提升用户体验。

1. HTML结构:基础骨架

首先,我们需要构建页面的基本HTML结构,包括一个搜索输入框和用于展示列表项的无序列表。

全球顶尖大学列表

  • Massachusetts Institute of Technology (MIT)
  • Stanford University
  • Harvard University
  • California Institute of Technology (Caltech)
  • University of Oxford
  • University of Cambridge
  • University of Chicago
  • ETH Zurich - Swiss Federal Institute of Technology
  • University of California, Berkeley (UCB)
  • Aalborg University (Denmark)
  • Aalto University (Finland)
  • Aarhus University (Denmark)
  • Abdullah Gül University (Turkey)
  • Abertay University (United Kingdom)
  • Aberystwyth University (United Kingdom)
  • Abia State University (Nigeria)
  • Abilene Christian University (United States)
  • Adam Mickiewicz University (Poland)
  • Addis Ababa University (Ethiopia)
  • Adelphi University (United States)
  • Princeton University

input 元素:类型为 search,具有 id=”search-box” 和 class=”search_box”,用于用户输入搜索关键词。ul 元素:具有 id=”world-universities_list” 和 class=”world-universities_list”,包含所有待搜索的列表项。li 元素:每个列表项都带有 class=”university”。

2. CSS样式:美化与高亮

为了使界面更具吸引力,并定义高亮显示的效果,我们需要添加一些CSS样式。其中,.highlight 类是实现高亮的关键。

body {    margin: 0;    padding: 0;    font-family: 'Poppins', sans-serif;}*, *::before, ::after {    padding: 0;    margin: 0;    box-sizing: border-box;}ul {    list-style-type: none;    padding: 0;    margin: 0;}main {    background-color: rgb(255, 255, 255);    margin: 1.5rem;    display: flex;    flex-direction: column;}.title {    text-align: center;    color: rgb(221, 4, 58);    font-weight: 600;    font-family: 'Poppins', sans-serif;    font-size: 2rem;    margin-top: 2rem;}.search_box {    display: block;    width: 100%;    height: 2rem;    border-radius: 0.5rem;    border: 1.5px solid #0000002c;    margin-top: 2rem;    outline: none;    padding: 2px;}.world-universities_list {    background-color: rgb(104, 7, 39);    color: white;    padding: 1.5rem;    border-radius: 1rem;    margin-top: 3rem;}.university:not(.last-u) {    margin-bottom: 2rem;}/* 高亮样式 */.highlight {    background-color: aqua; /* 高亮背景色 */    font-weight: bold;      /* 高亮字体加粗 */    color: black;           /* 确保高亮文字清晰可见 */    padding: 2px 0;         /* 适当内边距 */    border-radius: 3px;     /* 轻微圆角 */}

3. JavaScript逻辑:核心交互

JavaScript代码负责监听用户的输入,并根据输入内容实时更新列表的显示和高亮。

立即学习“Java免费学习笔记(深入)”;

// 获取DOM元素const searchBox = document.getElementById("search-box");const universities = document.querySelectorAll(".university"); // 获取所有大学列表项// 定义搜索功能函数const searchUniversity = () => {  // 监听搜索框的键盘抬起事件  searchBox.addEventListener("keyup", () => {    // 获取搜索框当前值,转换为小写并去除所有空格    const searchBoxInput = searchBox.value.toLowerCase();    const noWhiteSpaceInput = searchBoxInput.replace(/s/g, ""); // 移除所有空格    // 遍历所有大学列表项    universities.forEach((university) => {      // 获取列表项的原始文本内容,转换为小写并去除所有空格      const universityName = university.textContent.toLowerCase().replace(/s/g, "");      // 存储原始文本内容,用于后续高亮操作      const originalText = university.textContent;      // 1. 过滤逻辑:根据搜索框输入显示或隐藏列表项      if (universityName.includes(noWhiteSpaceInput)) {        university.style.display = "block"; // 匹配则显示      } else {        university.style.display = "none";  // 不匹配则隐藏      }      // 2. 高亮逻辑:如果搜索框有输入,则高亮匹配部分      if (noWhiteSpaceInput.length > 0) {        // 创建正则表达式,'gi' 表示全局匹配和不区分大小写        const regex = new RegExp(`(${noWhiteSpaceInput})`, "gi");        // 使用replace方法,将匹配到的内容用标签包裹,并应用highlight样式        // $1 代表正则表达式中第一个捕获组(即括号内的内容)        const highlightedText = originalText.replace(regex, "$1");        university.innerHTML = highlightedText; // 更新列表项的HTML内容      } else {        // 如果搜索框为空,则恢复列表项的原始文本,移除所有高亮        university.innerHTML = originalText;      }    });  });};// 调用搜索功能函数,启动监听searchUniversity();

代码详解:

DOM元素获取:searchBox:通过 id 获取搜索输入框元素。universities:通过 class 获取所有

  • 列表项元素,返回一个 NodeList。事件监听:searchBox.addEventListener(“keyup”, …):当用户在搜索框中输入并抬起键盘时,会触发回调函数输入处理:searchBoxInput = searchBox.value.toLowerCase():获取搜索框的当前值,并转换为小写,实现不区分大小写的搜索。noWhiteSpaceInput = searchBoxInput.replace(/s/g, “”):移除输入中的所有空格,使得搜索“MassachusettsInstitute”也能匹配“Massachusetts Institute”。列表项遍历:universities.forEach((university) => { … }):遍历所有大学列表项。universityName = university.textContent.toLowerCase().replace(/s/g, “”):对每个列表项的文本内容进行与搜索输入相同的标准化处理。originalText = university.textContent:存储原始文本,以便在清空搜索框时恢复。过滤逻辑:if (universityName.includes(noWhiteSpaceInput)):使用 includes() 方法判断列表项文本是否包含搜索输入。university.style.display = “block” 或 “none”:根据匹配结果显示或隐藏列表项。高亮逻辑:if (noWhiteSpaceInput.length > 0):只有当搜索框有内容时才执行高亮。const regex = new RegExp((${noWhiteSpaceInput}), “gi”);:创建一个正则表达式。noWhiteSpaceInput 是搜索关键词。() 创建一个捕获组,以便在替换时引用匹配到的文本。g (global):查找所有匹配项,而不是找到第一个就停止。i (case-insensitive):不区分大小写匹配。const highlightedText = originalText.replace(regex, “$1“);:使用 replace() 方法替换匹配到的文本。$1 引用了正则表达式中第一个捕获组的内容,即实际匹配到的关键词。将匹配到的关键词包裹在 标签中。university.innerHTML = highlightedText;:将包含高亮标签的新HTML内容赋值给列表项的 innerHTML。else { university.innerHTML = originalText; }:如果搜索框为空,则将列表项的 innerHTML 恢复为原始文本,移除所有高亮。

    4. 注意事项与总结

    性能考虑:对于包含成千上万个列表项的超大型列表,每次 keyup 事件都遍历并修改DOM可能会导致性能问题。在这种情况下,可以考虑使用虚拟列表(Virtual List)或进行节流/防抖(Throttling/Debouncing)优化。安全性:直接使用 innerHTML 插入用户输入内容时,存在XSS(跨站脚本攻击)风险。但在本例中,我们只将原始列表项文本和用户输入(用于高亮)结合,风险较低。如果列表项内容或搜索关键词可能包含恶意脚本,则需要对输入进行严格的净化处理。用户体验:提供清晰的占位符(placeholder)提示用户搜索功能。确保高亮颜色与背景色有足够的对比度,以保证可读性。在搜索结果为空时,可以显示一条“未找到匹配项”的消息,而不是仅仅隐藏所有列表项。

    通过上述步骤,您已经成功实现了一个功能完善且用户友好的实时搜索和高亮显示功能。这个模式在许多Web应用中都非常常见,掌握它将对您的前端开发技能大有裨益。

    以上就是JavaScript实现搜索框实时过滤与高亮显示列表项的详细内容,更多请关注创想鸟其它相关文章!

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
    发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/198784.html

  • (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2025年11月1日 19:56:45
    下一篇 2025年11月1日 20:02:15

    相关推荐

    • C++类模板的基本语法与使用方法

      C++类模板通过参数化类型实现代码复用,解决重复编写相似逻辑的痛点,提升类型安全与性能,支持STL等通用库开发;其成员函数在类外定义时需加template 前缀并明确作用域,避免编译错误;模板特化用于为特定类型提供定制实现,偏特化则针对部分参数或指针等形式优化行为,增强灵活性与效率。 C++类模板,…

      2025年12月18日
      000
    • C++如何处理指针悬空和野指针问题

      悬空指针指内存释放后指针未置空,野指针指未初始化的指针;应初始化指针、delete后置为nullptr,并优先使用智能指针和标准容器以避免问题。 指针悬空和野指针是C++中常见的内存管理问题,容易引发程序崩溃或不可预测的行为。解决这类问题的关键在于良好的编程习惯和现代C++特性的合理使用。 什么是悬…

      2025年12月18日
      000
    • C++开发环境搭建中常见错误及解决方法

      答案是路径配置错误导致编译器或链接器无法找到头文件、库文件,或运行时找不到动态库。核心在于正确设置头文件路径(-I)、库文件路径(-L)、链接库名(-l),确保编译器、库、系统位数一致,并在运行时通过PATH或LD_LIBRARY_PATH确保动态库可被找到。 C++开发环境的搭建,说实话,初上手总…

      2025年12月18日
      000
    • C++类模板特化与偏特化使用技巧

      类模板特化与偏特化可针对特定类型或类型组合定制实现。全特化用于具体类型,如const char*,语法为template class MyContainer;偏特化用于部分约束,如所有指针类型T*,语法为template class MyContainer。特化需在同一命名空间,偏特化不能新增参数,…

      2025年12月18日
      000
    • C++开闭原则实现 扩展开放修改关闭

      开闭原则要求软件实体对扩展开放、对修改关闭,C++通过抽象基类Shape定义纯虚函数area(),Rectangle和Circle等派生类实现具体逻辑,新增图形只需添加新类而不修改已有代码,结合运行时多态和基类指针,使printAreas等函数无需改动即可支持新类型,实现系统灵活扩展与稳定维护。 开…

      2025年12月18日
      000
    • C++的联合体union是什么以及它的内存共享特性如何工作

      C++联合体union与结构体struct的核心差异在于内存布局:struct成员独立存储,可同时访问;union成员共享内存,任一时刻只能安全使用一个成员。union大小由最大成员决定,用于节省内存,而struct用于组织相关数据。 C++中的 union (联合体)是一种特殊的数据结构,它允许在…

      2025年12月18日
      000
    • C++模板类与多态结合实现通用接口

      答案:C++模板类与多态结合通过抽象基类定义统一接口,模板派生类封装具体类型操作,实现异构对象的统一管理与高效处理,兼顾编译期优化与运行时灵活性,适用于命令模式、事件系统等需类型安全与多态共存的场景。 在C++的世界里,模板类与多态的结合,在我看来,是一种相当精妙的设计哲学,它允许我们构建出既能享受…

      2025年12月18日
      000
    • C++使用MinGW在Windows上搭建环境流程

      答案:通过MinGW-w64在Windows上搭建C++开发环境,需下载并解压MinGW-w64至无空格路径,将bin目录添加到系统Path环境变量,验证g++、gcc、gdb命令是否可用,最后用简单C++程序测试编译运行;推荐使用x86_64-posix-seh版本,因其对64位系统支持更好且兼容…

      2025年12月18日
      000
    • C++如何使用嵌套组合类型实现复杂模型

      嵌套组合类型通过将复杂系统拆解为职责明确的模块,实现高内聚、低耦合,提升代码可维护性与复用性,如Car类组合Engine、Wheel等组件,清晰构建复杂模型。 C++中利用嵌套组合类型来构建复杂模型,在我看来,这简直是软件工程里最优雅、最直观的抽象手段之一。它本质上就是将一个庞大、复杂的系统,拆解成…

      2025年12月18日
      000
    • C++享元模式管理大量对象共享数据

      享元模式通过共享内部状态减少内存占用,C++中利用享元池存储可共享对象,结合互斥锁等机制处理线程安全,适用于游戏开发中大量相似对象的管理,与对象池模式在共享和重用上存在区别。 享元模式旨在通过共享对象来减少内存占用,尤其是在需要大量相似对象时。C++中,这意味着将对象的内部状态(即不变的部分)与外部…

      2025年12月18日
      000
    • C++像素画编辑器 简单绘图程序实现

      答案是C++%ignore_a_1%编辑器通过SDL2等图形库管理二维像素数组,利用事件循环处理鼠标输入,将坐标映射到逻辑像素并实时渲染纹理,实现高效绘图。其优势在于性能强、控制精细,挑战在于开发复杂度高。优化策略包括使用纹理批量渲染、避免逐像素绘制、采用脏矩形更新和硬件加速。扩展功能可涵盖撤销重做…

      2025年12月18日
      000
    • C++模板元编程基础与应用解析

      C++模板元编程通过模板递归与特化、类型操作和SFINAE等机制,在编译期完成计算与代码生成,实现零运行时开销、强类型安全及代码泛化,广泛应用于类型特性、表达式模板、序列化等场景,并随constexpr、if constexpr、概念等现代C++特性演进而更易用。 C++模板元编程,在我看来,是一门…

      2025年12月18日
      000
    • C++环境搭建中如何管理多版本编译器

      答案:管理C++多版本编译器需结合系统工具链、环境变量与构建系统配置。Linux下可用update-alternatives切换GCC版本,或通过PATH和LD_LIBRARY_PATH指定路径;跨平台项目可用CMake的CMAKE_C_COMPILER与CMAKE_CXX_COMPILER变量或T…

      2025年12月18日
      000
    • C++如何在内存管理中避免多重释放同一内存

      答案:避免C++多重释放的核心是使用智能指针和RAII。智能指针如std::unique_ptr和std::shared_ptr通过自动管理内存生命周期,确保资源只被释放一次;RAII原则将资源与对象生命周期绑定,析构时自动释放,防止泄漏与重复释放;手动管理时需释放后置空指针并明确所有权,遵循Rul…

      2025年12月18日
      000
    • C++开发环境中如何配置第三方库路径

      配置第三方库路径需设置头文件和库文件路径,并指定链接库,可通过IDE、CMake或命令行实现,其中CMake因跨平台和自动化依赖管理更优。 在C++开发环境中配置第三方库路径,核心在于告诉编译器去哪里找头文件( .h 或 .hpp ),以及告诉链接器去哪里找实际的库文件(在Windows上通常是 .…

      2025年12月18日
      000
    • C++如何实现简单日程安排程序

      答案:程序通过定义Event结构体和vector容器管理日程,结合文件I/O实现数据持久化,使用菜单驱动的交互方式,具备添加、查看、保存功能,并通过排序提升可读性。 实现一个简单的C++日程安排程序,核心在于定义一个数据结构来表示日程事件,并利用标准库容器(如 std::vector )来管理这些事…

      2025年12月18日
      000
    • C++工厂模式创建对象的通用方法

      工厂模式通过解耦对象创建与使用,提升代码扩展性和维护性;其通用方法为工厂方法模式,定义抽象工厂和产品,由子类决定具体创建类型,适用于需动态创建不同对象的场景。 C++中工厂模式创建对象的通用方法,本质上是为了将对象的创建过程与使用过程解耦。它提供了一种灵活、可扩展的机制,让你可以在运行时决定创建哪种…

      2025年12月18日
      000
    • C++移动构造函数与移动赋值操作实现

      C++移动语义通过右值引用实现资源“窃取”,避免深拷贝。移动构造函数(ClassName(ClassName&&))和移动赋值操作符(operator=(ClassName&&))转移资源并置空源对象,提升性能。std::move将左值转为右值引用,触发移动操作,但不…

      2025年12月18日
      000
    • C++11的聚合初始化如何简化结构体的创建过程

      C++11聚合初始化通过花括号按成员声明顺序直接初始化聚合体,适用于无用户构造函数、无私有保护成员、无基类、无虚函数的结构体,支持嵌套初始化与类型安全,提升代码简洁性与可读性。 C++11的聚合初始化,简单来说,就是通过一个简洁的花括号列表,直接按照成员的声明顺序为结构体(或数组)的成员赋值,极大地…

      2025年12月18日
      000
    • C++STL算法copy_backward和move_backward使用

      答案:std::copy_backward和std::move_backward用于处理源和目标区间重叠且目标起始位置在源之后的场景,通过从后向前操作避免数据覆盖;前者复制元素,后者移动元素,均要求双向迭代器并确保目标空间已分配,常用于提升性能并防止原数据被提前覆盖。 在C++标准模板库(STL)中…

      2025年12月18日
      000

    发表回复

    登录后才能评论
    关注微信