0

0

如何在 Fetch 请求期间正确显示加载动画(Preloader)

心靈之曲

心靈之曲

发布时间:2026-02-05 15:55:19

|

795人浏览过

|

来源于php中文网

原创

如何在 Fetch 请求期间正确显示加载动画(Preloader)

本文详解如何在使用 javascript fetch api 获取数据时,确保加载指示器(如旋转动画)能及时、可靠地显示与隐藏,重点解决因 css 选择器作用域错误导致的 preloader 不可见问题。

在基于 Fetch 的异步请求中,为提升用户体验,通常需在请求发起后立即显示加载动画(preloader),并在响应完成或出错后将其隐藏。但许多开发者会遇到“明明调用了 showLoad(),页面却看不到 loader”的情况——这往往并非逻辑错误,而是 CSS 样式优先级或选择器匹配失效所致。

在你提供的代码中,关键问题在于 CSS 类名绑定与样式定义不一致:

#load {
  display: none; /* 初始隐藏 */
}

#load.display {
  display: block;
}

而 JavaScript 中通过 loader.classList.add('display') 添加的是类名 display,但该类仅在元素同时具有 id="load" 拥有 class="display" 时才生效。看似合理,实则存在隐患:若后续 HTML 结构微调(如 id 变更)、或 CSS 预处理器/框架引入更高优先级规则,#load.display 就可能被覆盖或失效。

✅ 正确做法是解耦 ID 与状态类,将显示控制权完全交由类名本身:

Face++旷视
Face++旷视

Face⁺⁺ AI开放平台

下载
#load {
  border: 5px solid #f3f3f3;
  border-top: 5px solid #3498db;
  border-radius: 50%;
  width: 20px;
  height: 20px;
  animation: spin 2s linear infinite;
  margin-left: 160px;
  display: none; /* 默认隐藏 */
}

.display {
  display: block !important; /* 强制生效,避免被其他样式覆盖 */
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

同时保持 JavaScript 不变(已正确):

function showLoad() {
  loader.classList.add('display');
}

function hideLoad() {
  loader.classList.remove('display');
}

function getWeather() {
  showLoad(); // ✅ 立即触发显示

  fetch(`http://api.weatherapi.com/v1/current.json?key=XXXXXXX&q=${input.value}&aqi=no`)
    .then(response => {
      if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
      return response.json();
    })
    .then(res => {
      const celsius = `Temp ${res.current.temp_c} °C`;
      divId.innerHTML = celsius;
    })
    .catch(err => {
      console.error('Weather fetch failed:', err);
      divId.innerHTML = 'Failed to load weather data.';
    })
    .finally(() => {
      hideLoad(); // ✅ 无论成功或失败,都确保隐藏
    });
}

⚠️ 关键优化点说明:

  • 使用 .finally() 替代仅在 .then() 中调用 hideLoad(),确保异常(如网络中断、JSON 解析失败、API 报错)时 loader 也能关闭,避免界面卡死在加载态;
  • 在 .display 规则中添加 !important 是防御性写法(尤其在复杂项目中),防止第三方样式或内联样式意外覆盖;
  • 建议为 fetch 添加 response.ok 校验,提升健壮性;
  • 若 loader 元素位于动态渲染区域,确保其 DOM 节点在脚本执行前已存在(你当前代码中通过 getElementById('load') 获取,符合要求)。

? 扩展建议:
如需支持多请求并发场景(例如用户快速点击多次),可增加防抖(debounce)或禁用按钮逻辑;对于更现代的方案,也可考虑使用

至此,preloader 将在每次点击搜索按钮后即时显现,并在数据就绪或出错后自动消失,真正实现“所见即所得”的加载反馈。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

428

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

541

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

78

2025.09.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

534

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

17

2025.12.06

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3538

2024.08.14

微信网页版文件传输助手教程合集
微信网页版文件传输助手教程合集

本专题整合了微信网页版文件传输助手教程、入口等等内容,阅读专题下面的文章了解更多详细内容。

15

2026.02.04

微信文件过期恢复教程
微信文件过期恢复教程

本专题整合了微信文件过期恢复方法、技巧教程,阅读专题下面的文章了解更多详细内容。

10

2026.02.04

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.2万人学习

CSS教程
CSS教程

共754课时 | 27.8万人学习

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

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