新闻中心

J*aScript卡片搜索:优化无结果提示显示逻辑

2025-10-29
浏览次数:
返回列表

JavaScript卡片搜索:优化无结果提示显示逻辑

本教程旨在解决动态卡片搜索中“无结果”提示显示不准确的问题。通过重构j*ascript搜索逻辑,我们首先隐藏所有卡片,接着根据搜索词筛选出匹配的卡片并显示它们,最后根据匹配卡片的数量精确控制“无内容”提示的可见性,确保该提示仅在没有搜索结果时才出现,从而提升用户体验。

在Web开发中,实现带有搜索功能的动态卡片展示是常见的需求。然而,一个常见的挑战是如何在没有搜索结果时,准确地显示“无内容”或“卡片未找到”的提示信息。如果处理不当,可能会导致提示信息过早或错误地显示,影响用户体验。本文将详细介绍如何通过优化J*aScript逻辑,实现一个健壮且用户友好的卡片搜索功能。

初始问题分析

在传统的循环遍历卡片并逐个判断显示状态的搜索逻辑中,很容易出现一个问题:当某个卡片不匹配时,立即将“无内容”提示设置为可见。这种做法的缺陷在于,即使后续还有其他卡片能够匹配搜索条件,或者搜索结果只剩一个,该提示也可能被错误地显示出来。正确的逻辑应该是:在所有卡片都被判断完毕后,根据最终匹配到的卡片数量来决定是否显示“无内容”提示。

核心优化思路

为了解决上述问题,我们需要改变处理搜索结果的策略。核心思路可以概括为以下三步:

  1. 预处理: 在开始搜索前,将所有卡片默认设置为隐藏状态。
  2. 筛选: 遍历所有卡片,根据搜索词筛选出所有匹配的卡片。
  3. 后处理: 根据筛选结果,显示所有匹配的卡片。如果匹配卡片数量为零,则显示“无内容”提示;否则,隐藏该提示。

这种“先全部隐藏,再选择性显示”的策略,确保了“无内容”提示的显示决策是在整个搜索过程完成后,基于最终结果做出的。

实现步骤与代码示例

我们将通过J*aScript、HTML和CSS的配合来完成这个功能。

1. HTML 结构

首先,确保你的HTML结构包含一个搜索输入框、一个卡片容器以及一个用于显示“无内容”提示的元素。

<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">
  <!-- 示例卡片,可以有多个 -->
  <div class="blog-card">
    <div class="blog-card-head">
      @@##@@
      <h2>Tips to keep your car running.</h2>
    </div>
    <div class="blog-card-body">
      @@##@@
      <h1 class="card-title">Auto Repair</h1>
    </div>
    <p>Did you know that in 2025 there were 201,927 active dentists in the United States? That means there is a ratio of approximately 61 dentists per 100,000 people in the country…</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/988">
                            <img src="https://img.php.cn/upload/ai_manual/000/000/000/175680110561807.png" alt="万相营造">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/988">万相营造</a>
                            <p>阿里妈妈推出的AI电商营销工具</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="万相营造">
                                <span>168</span>
                            </div>
                        </div>
                        <a href="/ai/988" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="万相营造">
                        </a>
                    </div>
                
    <div class="blog-card-footer">
      <a href="#">Read More @@##@@</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 规则隐藏。

2. 优化的 J*aScript 逻辑

以下是经过优化的 myFunction 函数,它实现了上述的核心优化思路:

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"); 
}

代码解析:

  • Array.from(cardContainer.getElementsByClassName("blog-card")): getElementsByClassName 返回的是一个 HTMLCollection,它不是真正的数组,不具备 forEach 或 filter 等方法。通过 Array.from() 可以将其转换为一个可操作的数组。
  • cards.forEach(card => card.style.display = "none"): 这一行在每次搜索开始时,确保所有卡片都被隐藏。这是一个关键的预处理步骤。
  • cards.filter(...): 使用 filter 方法创建一个新数组 matchingCards,其中只包含标题与搜索词匹配的卡片。includes() 方法用于判断字符串是否包含另一个字符串。
  • matchingCards.forEach(card => card.style.display = "block"): 遍历 matchingCards 数组,将所有匹配的卡片设置为可见。
  • noContent.style.display = (matchingCards.length === 0 ? "flex" : "none"): 这是决定“无内容”提示显示与否的最终逻辑。如果 matchingCards 数组为空(即 length 为0),则显示 noContent 元素(设置为 flex 以利用其CSS样式);否则,将其隐藏。

3. CSS 样式

确保 no-content 元素有适当的样式,以便在显示时能够居中且美观。

@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@500&family=Open+Sans:wght@700&display=swap');

/* 其他样式... */

.no-content {
  width: 100vw;
  height: 50vh;
  display: flex; /* 默认隐藏,通过JS控制显示时设置为flex */
  justify-content: center;
  align-items: center;
}

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

注意:在HTML中,no-content 元素默认添加了 style="display: none;",这样可以确保页面加载时它是隐藏的。J*aScript会根据搜索结果动态地将其设置为 flex 或 none。

注意事项与最佳实践

  • 大小写不敏感搜索: 在示例代码中,我们通过 toUpperCase() 将搜索词和卡片标题都转换为大写进行比较,实现了大小写不敏感的搜索。
  • 性能优化: 对于非常大量的卡片(数千个以上),每次键盘输入都遍历和操作DOM可能会有性能问题。可以考虑引入去抖(debounce)技术,减少 myFunction 的调用频率,或使用虚拟滚动等高级优化手段。
  • 用户体验: 可以在搜索时添加加载指示器,或者在搜索结果为空时提供建议,例如“请尝试其他关键词”。
  • 可访问性: 考虑为搜索输入框添加 aria-label 或 label,并确保“无内容”提示在屏幕阅读器中可被正确识别。

总结

通过上述优化后的J*aScript逻辑,我们成功地解决了卡片搜索中“无内容”提示显示不准确的问题。核心在于将卡片显示和“无内容”提示的决策逻辑分离,先统一处理所有卡片的显示状态,再根据最终匹配结果进行判断。这种方法不仅提高了代码的健壮性,也极大地提升了用户在使用搜索功能时的体验。

以上就是J*aScript卡片搜索:优化无结果提示显示逻辑的详细内容,更多请关注其它相关文章!


# 表单  # 南京网站网站建设学校  # 台州网站建设与营运  # 可以免费推广的网站  # 东宝区seo关键词排名优化报价  # 建设网站公司电话号码  # seo埋关键词  # 巴中房产网站建设  # 海西州高端网站建设  # 广州矩阵seo方式有哪些  # Yuri Seo男朋友  # 单选框  # 重构  # 搜索功能  # 转换为  # 将其  # css  # 遍历  # 设置为  # 搜索结果  # 关键词  # css样式  # google  # ai  # app  # svg  # go  # js  # html  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: J*aScript实现单选按钮与关联输入框的联动禁用教程  Python getattr() 异常处理深度解析:避免程序意外退出  HTML长属性值处理:表单action路径优化与代码规范应对  探索高级语言到原生C/C++的转译:挑战与内存管理策略  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  J*a里如何使用forEach遍历Map_Map遍历方法说明  uc浏览器网页版入口 uc浏览器网页版最新网址  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  C++如何实现异步操作_C++11使用std::future和std::async进行异步编程  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  三星ZFold5多任务卡顿_Samsung ZFold5流畅度提升  构建轻量级网站内部消息系统:Formspree 集成指南  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  Python中如何避免重复条件判断:利用数据结构实现动态逻辑  C++指针和引用有什么区别_C++内存管理核心概念深度解析  ArrayList与LinkedList操作复杂度详解:遍历与修改  vivo云服务网页版登录 怎么登录vivo云服务网页版  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  steam官方入口大全 steam账号注册及操作指南  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  如何有效阻止外部脚本意外修改内联样式的高度属性  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  Discord Slash 命令响应超时问题的异步解决方案  创客贴用户入口官网登录 创客贴网页版电脑版系统  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  Win11怎么关闭触摸屏_Windows 11禁用HID符合标准触摸屏  为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法  使用J*aScript检测输入元素是否包含在特定类中  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  poki网页游戏推荐_poki免费游戏平台入口  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  必由学官网首页入口 必由学教师网页版登录指南  iwriter统一登录平台 iwrite账号密码登录页面  Bing引擎入口最新2025 Bing搜索免费官方登录  京东单号查询入口_京东快递订单追踪入口  Python字典中优雅地迭代剩余元素的方法  小米Civi 4录制视频过暗_小米Civi 4亮度优化  微信网页版登录教程_微信网页版登录入口在哪  Golang如何使用net/url解析URL_Golang URL解析与处理方法  J*aScript DOM操作:高效清空列表元素的策略与实践  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  在J*a项目里如何构建对象之间的契约_接口约束的实际落地  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法  Linux如何构建多环境配置管理_Linux多环境配置方案 

搜索