0

0

实现动态搜索卡片并准确显示“无结果”提示的教程

心靈之曲

心靈之曲

发布时间:2025-10-28 13:03:11

|

503人浏览过

|

来源于php中文网

原创

实现动态搜索卡片并准确显示“无结果”提示的教程

本教程详细介绍了如何优化javascript卡片搜索功能,确保“无结果”提示仅在没有匹配项时显示,而非在搜索过程中误触。通过重构搜索逻辑,首先筛选出所有匹配项,然后根据匹配结果的数量来控制卡片的显示与“无结果”提示的切换,从而提供更准确、用户友好的交互体验。

在现代Web应用中,动态内容过滤和搜索是常见功能。当用户在搜索框中输入关键词时,页面上的卡片(或其他内容项)会根据关键词进行筛选,只显示匹配的结果。然而,一个常见的挑战是,如何在没有匹配结果时,优雅地显示一个“无结果”提示,而不是在每次隐藏一个不匹配的卡片时都错误地显示它。本文将深入探讨如何通过优化JavaScript逻辑来解决这一问题,确保“无结果”提示的准确显示。

问题分析:原始方法的不足

原始的搜索逻辑通常在一个循环中遍历所有卡片。在循环内部,如果一张卡片不匹配搜索条件,它会被隐藏,并且“无结果”提示可能会被设置为显示。这种逐个判断的方式会导致问题:即使还有其他卡片匹配,只要当前循环到的卡片不匹配,提示就可能被错误地显示出来。

例如,以下是原始代码片段中的关键逻辑:

for (i = 0; i < cards.length; i++) {
  title = cards[i].querySelector(".card-title");
  if (title.innerText.toUpperCase().indexOf(filter) > -1) {
    cards[i].style.display = "block";
  } else {
    cards[i].style.display = "none";
    // 这里的逻辑会导致问题:只要有一个卡片不匹配,就显示“无内容”
    noContent.style.display = "flex"; 
  }
}

这段代码的问题在于,noContent.style.display = "flex"; 这行代码在每次遇到不匹配的卡片时都会执行。如果搜索结果只剩下一张卡片,而其他卡片都被隐藏,那么在隐藏那些不匹配的卡片时,“无内容”提示就会被错误地显示出来。我们期望的是,只有当 所有 卡片都不匹配时,才显示“无内容”提示。

优化解决方案:先过滤后显示

为了解决上述问题,我们需要改变处理逻辑:首先遍历所有卡片,找出所有匹配的卡片,然后根据匹配卡片的总数来决定是显示匹配卡片还是“无结果”提示。

以下是优化后的JavaScript代码:

function myFunction() {
  const input = document.getElementById("myFilter");
  const noContent = document.getElementById("no-content");
  const filter = input.value.toUpperCase();
  const cardContainer = document.getElementById("myItems");
  // 将HTMLCollection转换为数组,以便使用forEach和filter等数组方法
  const cards = Array.from(cardContainer.getElementsByClassName("blog-card"));

  // 1. 首先,隐藏所有卡片,为后续的显示做准备
  cards.forEach(card => card.style.display = "none");

  // 2. 筛选出所有匹配搜索条件的卡片
  const matchingCards = cards.filter(
    card => card.querySelector(".card-title").innerText.toUpperCase().includes(filter));

  // 3. 使所有匹配的卡片可见
  matchingCards.forEach(card => card.style.display = "block");

  // 4. 根据匹配卡片的数量来切换“无内容”提示的显示状态
  noContent.style.display = (matchingCards.length === 0 ? "flex" : "none"); 
}

关键改进点:

  1. 转换为数组: 使用 Array.from() 将 getElementsByClassName 返回的 HTMLCollection 转换为真正的数组。这使得我们可以方便地使用 forEach、filter 等现代JavaScript数组方法。
  2. 统一隐藏: 在开始筛选之前,先将所有卡片隐藏。这样可以确保在每次搜索操作开始时,UI处于一个干净的状态。
  3. 集中过滤: 使用 filter() 方法一次性找出所有符合搜索条件的卡片,并将它们存储在 matchingCards 数组中。
  4. 集中显示: 遍历 matchingCards 数组,只显示这些匹配的卡片。
  5. 条件判断显示“无结果”: 最后,根据 matchingCards 数组的长度来判断是否显示“无结果”提示。如果 matchingCards.length 为 0,则表示没有匹配的卡片,此时才显示 noContent 元素。

HTML结构

为了支持上述JavaScript逻辑,HTML结构需要包含搜索输入框、卡片容器和“无结果”提示元素。

OpenJobs AI
OpenJobs AI

AI驱动的职位搜索推荐平台

下载
<div class="input-container">
  <input type="text" id="myFilter" class="search-imput" onkeyup="myFunction()" placeholder="Search for names..">
</div>

<div class="card-container" id="myItems">
  <!-- 多个 .blog-card 元素 -->
  <div class="blog-card">
    <div class="blog-card-head">
      <img src="..." alt="">
      <h2>Tips to keep your car running.</h2>
    </div>
    <div class="blog-card-body">
      <img src="..." alt="">
      <h1 class="card-title">Auto Repair</h1>
    </div>
    <p>...</p>
    <div class="blog-card-footer">
      <a href="#">Read More <img src="..." alt=""></a>
    </div>
  </div>
  <!-- ... 更多卡片 ... -->
</div>

<!-- 无结果提示,初始可以隐藏 -->
<div class="no-content" id="no-content" style="display: none;">
  <h1>there are no more blog post with this term</h1>
</div>

注意: 初始时,no-content 元素可以通过 style="display: none;" 或者在CSS中设置 display: none; 来隐藏。JavaScript会根据搜索结果动态控制其显示。

CSS样式

CSS样式主要用于布局和美化卡片以及“无结果”提示。以下是与功能相关的关键样式:

.card-container {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  /* ... 其他样式 ... */
}

.blog-card {
  /* ... 卡片样式 ... */
}

.no-content {
  width: 100vw;
  height: 50vh;
  display: flex; /* 默认设置为flex,方便JavaScript控制显示/隐藏 */
  justify-content: center;
  align-items: center;
  /* ... 其他样式 ... */
}

.no-content h1 {
  font-size: 20px;
  padding: 0px 20px;
  font-family: 'Montserrat', sans-serif;
  color: #161663;
}

这里 .no-content 的 display: flex; 是在它被显示时的默认状态。JavaScript会通过设置 noContent.style.display = "none"; 或 noContent.style.display = "flex"; 来覆盖这个状态。

总结与最佳实践

通过上述优化,我们实现了一个更加健壮和用户友好的卡片搜索功能。这种“先过滤,后根据结果统一更新UI”的模式是处理动态内容过滤的常见最佳实践。

核心要点:

  • 分离关注点: 将数据过滤逻辑与UI更新逻辑分离。首先完成数据处理,然后根据处理结果统一更新视图。
  • 使用现代JavaScript: 充分利用 Array.from()、forEach()、filter() 等数组方法,使代码更简洁、可读性更强。
  • 初始化状态: 确保在每次搜索开始时,UI元素(如卡片和“无结果”提示)都重置到正确的初始状态,避免上次操作的残留影响。
  • 明确的条件判断: 只有当明确判断没有匹配结果时,才显示“无结果”提示,避免误报。

遵循这些原则,可以构建出响应迅速、逻辑清晰且易于维护的动态搜索界面。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

288

2025.12.04

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

954

2023.09.19

flex教程
flex教程

php中文网为大家带来了flex教程合集,Flex是采用Flex布局的元素,称为Flex容器(flex container),简称"容器",它的所有子元素自动成为容器成员,有三个核心概念: flex项,需要布局的元素;flex容器,其包含flex项;排列方向,这决定了flex项的布局方向。php中文网还为大家带来flex的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

372

2023.06.14

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

2

2026.03.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

90

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

136

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

380

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

64

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

111

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.0万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 43.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号