使用原生J*aScript实现动态搜索过滤及无结果提示


使用原生JavaScript实现动态搜索过滤及无结果提示

本教程详细介绍了如何使用原生j*ascript构建一个动态搜索过滤器,并在此基础上增加一个“无匹配项”提示功能。文章将通过优化dom操作、css样式(特别是`display: none`的使用),以及清晰的j*ascript逻辑,指导开发者实现一个用户友好的搜索体验,确保在搜索结果为空时能及时向用户反馈。

在现代Web应用中,搜索过滤功能是提升用户体验的关键一环。当用户输入查询词时,实时显示匹配结果并隐藏不匹配项,是基础功能。然而,当没有任何结果匹配用户的搜索时,提供一个明确的“无匹配项”提示,能够显著改善用户交互。本教程将引导您逐步实现这一功能。

核心功能:基础搜索过滤实现

首先,我们构建一个基础的搜索过滤器。它包含一个搜索输入框和一系列可被过滤的卡片元素。

HTML 结构

我们的HTML结构包括一个搜索输入框 (.card-filter)、一个用于显示“无匹配项”的段落 (#mensaje),以及一个包含多个卡片 (.card) 的容器。

<section id="seccion-diez" class="section">
  <h2 data-dark>Filtro de Búsqueda</h2>
  <input type="search" name="busqueda" placeholder="Buscar..." class="card-filter">
  <!-- 初始时隐藏,当无匹配项时显示 -->
  <p class="hidden" id="mensaje">Los resultados no coincinden con la busqueda</p>
  <article class="contenedor-cards">
    <figure class="card">
      @@##@@
      <figcaption>Naturaleza</figcaption>
    </figure>
    <figure class="card">
      @@##@@
      <figcaption>Random</figcaption>
    </figure>
    <figure class="card">
      @@##@@
      <figcaption>Tecnología</figcaption>
    </figure>
    <figure class="card">
      @@##@@
      <figcaption>Persona</figcaption>
    </figure>
    <figure class="card">
      @@##@@
      <figcaption>Animal</figcaption>
    </figure>
    <figure class="card">
      @@##@@
      <figcaption>Arquitectura</figcaption>
    </figure>
  </article>
</section>

CSS 样式

为了隐藏不匹配的卡片和“无匹配项”提示,我们定义一个 .hidden 类。关键在于使用 display: none; 而不是 visibility: hidden;,因为 display: none; 会将元素从文档流中完全移除,不占用任何空间,从而避免布局问题。

.hidden {
  display: none; /* 将元素从文档流中移除 */
  opacity: 0;    /* 配合过渡效果,虽然 display: none 会立即隐藏 */
  order: 1;      /* 可能用于 Flexbox/Grid 布局,将隐藏元素排序到末尾 */
}

J*aScript 过滤逻辑

J*aScript 代码将监听搜索输入框的 keyup 事件。每当用户输入时,它会遍历所有卡片,根据卡片文本内容是否包含搜索关键词来添加或移除 .hidden 类。

察言观数AskTable 察言观数AskTable

企业级AI数据表格智能体平台

察言观数AskTable 72 查看详情 察言观数AskTable
const d = document;

export default function filtroBusqueda(inputSelector, cardSelector) {
  d.addEventListener("keyup", (e) => {
    // 确保事件源是目标输入框
    if (!e.target.matches(inputSelector)) return;

    // 按下 Escape 键时清空输入框
    if (e.key === "Escape") e.target.value = "";

    // 遍历所有卡片,根据搜索值显示或隐藏
    d.querySelectorAll(cardSelector).forEach((elemento) => {
      const isMatch = elemento.textContent.toLowerCase().includes(e.target.value.toLowerCase());
      if (isMatch) {
        elemento.classList.remove("hidden");
      } else {
        elemento.classList.add("hidden");
      }
    });

    // 这里将是添加“无匹配项”提示逻辑的地方
  });
}

// 在 DOM 加载完成后初始化过滤器
d.addEventListener("DOMContentLoaded", (e) => {
  filtroBusqueda(".card-filter", ".card");
});

增强功能:添加“无匹配项”提示

现在,我们来完善上述J*aScript代码,使其在没有搜索结果时显示提示信息。

J*aScript 逻辑更新

在卡片过滤逻辑之后,我们需要检查当前有多少卡片是可见的(即没有 .hidden 类)。根据这个数量,我们来决定是否显示 #mensaje 元素。

  1. 收集可见元素: 使用 querySelectorAll 结合 filter 方法,筛选出所有未被隐藏的卡片。
  2. 判断结果数量: 检查可见卡片数组的长度。
  3. 切换提示信息: 如果有可见卡片,则隐藏 #mensaje;如果没有可见卡片,则显示 #mensaje。

以下是完整的J*aScript代码,包含了这一增强功能:

const d = document;

export default function filtroBusqueda(inputSelector, cardSelector) {
  d.addEventListener("keyup", (e) => {
    // 确保事件源是目标输入框,使用早返回减少嵌套
    if (!e.target.matches(inputSelector)) return;

    // 按下 Escape 键时清空输入框
    if (e.key === "Escape") e.target.value = "";

    // 获取搜索输入框的值,并转换为小写以便进行不区分大小写的比较
    const searchValue = e.target.value.toLowerCase();

    // 遍历所有卡片,根据搜索值显示或隐藏
    d.querySelectorAll(cardSelector).forEach((elemento) => {
      // 将卡片的文本内容转换为小写进行比较
      const isMatch = elemento.textContent.toLowerCase().includes(searchValue);
      if (isMatch) {
        elemento.classList.remove("hidden");
      } else {
        elemento.classList.add("hidden");
      }
    });

    // 获取所有卡片,并过滤出当前可见(没有 'hidden' 类)的卡片
    const visibleCards = [...d.querySelectorAll(cardSelector)].filter(
      (elemento) => !elemento.classList.contains("hidden")
    );

    // 根据可见卡片的数量来显示或隐藏“无匹配项”消息
    const messageElement = d.querySelector("#mensaje");
    if (visibleCards.length > 0) {
      // 有可见卡片,隐藏消息
      messageElement.classList.add("hidden");
    } else {
      // 没有可见卡片,显示消息
      messageElement.classList.remove("hidden");
    }
  });
}

// 在 DOM 加载完成后初始化过滤器
d.addEventListener("DOMContentLoaded", (e) => {
  filtroBusqueda(".card-filter", ".card");
});

注意事项与最佳实践

  • display: none vs visibility: hidden: 如前所述,display: none 是隐藏元素并将其从文档流中移除的最佳选择,因为它不会占用空间,也不会影响页面布局。而 visibility: hidden 仅使元素不可见,但其仍会占用原有的空间。
  • 早期返回 (Early Return): 在J*aScript函数中,使用 if (!condition) return; 这样的早期返回语句可以使代码更扁平、更易读,避免深层嵌套。
  • 语义化类名: 使用如 hidden 这样的类名比 filter 更清晰地表达了其作用。
  • 性能优化: 对于非常大量的DOM元素,频繁的 querySelectorAll 和 DOM 操作可能会影响性能。可以考虑对元素进行一次性获取,或者使用虚拟DOM库(如React, Vue)来优化。对于本例中的少量卡片,原生JS的性能是足够的。
  • 可访问性 (Accessibility): 对于屏幕阅读器用户,当内容动态变化时,可以考虑使用ARIA属性(如 aria-live)来通知用户。

总结

通过本教程,您学会了如何使用原生J*aScript构建一个功能完善的搜索过滤器,并添加了用户友好的“无匹配项”提示。这包括了HTML结构的设置、CSS样式的优化(特别是 display: none 的应用),以及核心的J*aScript逻辑,用于根据搜索关键词动态显示或隐藏元素,并根据结果数量切换提示信息。掌握这些技术将帮助您创建更具交互性和用户体验的Web应用。

natureanytechpeopleanimalsarch

以上就是使用原生J*aScript实现动态搜索过滤及无结果提示的详细内容,更多请关注其它相关文章!


# vue  # 千牛如何搜关键词排名  # 吐鲁番知名网站建设企业  # 电商收集关键词排名优化  # 好的雕塑文案网站推广  # 二维推广网站  # 转换为  # 搜索结果  # 按下  # 文档  # 构建一个  # 这一  # 提示信息  # 遍历  # css  # react  # javascript  # java  # html  # js  # access  # ssl  # ai  # css样式  # 输入框  # 移除  # 温州网站建设全攻略  # 毕节营销推广项目有哪些  # 公司营销型网站建设方案  # 门户网站怎么推广好做呢  # seo教学新手入门运营 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 《大周列国志》皇帝律令功能介绍  铁路12306买票怎么选双人铺 铁路12306卧铺分配规则说明  4399造梦西游3无敌版_4399游戏入口  《长生:天机降世》火塔小怪大全  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30  mysql怎么导入sql文件_mysql导入sql文件的方法与技巧  腾讯QQ邮箱官方入口 QQ邮箱网页版登录平台  天天漫画2025最新入口 天天漫画永久有效登录入口  小米手机屏幕失灵乱跳怎么办 屏幕触控问题自检与临时解决方法【应急】  国际经济与贸易就业方向解析  《友玩*》创建群聊方法  基于 Flink 和 Kafka 实现高效流处理:连续查询与时间窗口  mysql镜像配置如何恢复数据_mysql镜像配置数据恢复详细流程  如何使用 Optional 类型并满足 Pylint 的类型检查  如何在CSS中实现盒模型多列间距_grid-gap与padding结合  search中maxlength属性用法解析  纯CSS实现自适应宽度与响应式布局的水平按钮组  谷歌邮箱怎么换绑定邮箱Gmail安全备份邮箱修改方法  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法  哈尔滨城市通昵称修改方法  包子漫画在线观看入口 包子漫画网正版全集链接  Golang如何使用crypto/md5生成哈希_Golang MD5哈希生成方法  Win11怎么设置分辨率 Win11显示设置调整分辨率及刷新率修改  Highcharts雷达图径向轴数值标签实现教程  基于键值条件高效映射 Pandas DataFrame 多列数据  《波斯王子:失落的王冠》剑术大师打法攻略  Eclipse开发J*a快速入门  顺丰官方查单号入口 顺丰快递单号查询官网入口  使用jQuery精确检测除指定元素外任意位置的点击事件  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  C++如何实现单例模式_C++线程安全的单例模式写法  阿里云共享相册入口在哪  视频号视频怎么免费保存到相册?保存到相册需要注意什么?  《合金装备4》有望推出重制版!制作人发话了  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  《百果园》充值余额方法  抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?  POKI小游戏在线免费入口链接 POKI小游戏无下载秒玩玩  mysql通配符能用于日志查询吗_mysql通配符在系统日志查询中的实际使用方法  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  获取WooCommerce产品在后台编辑页面的分类ID  批改网网页版登录 批改网电脑版学生登录入口  行者app怎样导出日志  Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合  蛙漫2(台版)正版官网 2025免费网页版分享  《绿竹漫游》关闭消息通知方法  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示 

 2025-12-03

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.