Bootstrap 按钮加载状态 Loading效果实现

雨辰君_2577

雨辰君_2577

2026-05-25

1093人浏览

原创

按钮点击后需手动禁用并显示loading文字,通过disabled属性和text/html动态控制,配合spinner增强反馈,恢复时必须在finally中执行以确保状态正确。

bootstrap 按钮加载状态 loading效果实现

按钮点击后禁用并显示 Loading 文字

Bootstrap 本身不内置“加载中”状态切换逻辑,得靠手动控制 disabled 属性和文本内容。核心是:点击瞬间改文字、加禁用、可选加 spinner;加载完成再还原。别指望 btn-primary 自己变 Loading —— 它只是样式容器。

常见错误是只改文字不设 disabled,导致用户重复点击;或用了 disabled 却没恢复,按钮永远点不了。

  • 用 button 元素(非 a),否则 disabled 无效
  • 原始 HTML 中保留默认文字,比如 <button class="btn btn-primary">提交</button>
  • JS 里先缓存原始文字:const originalText = $btn.text();
  • 加载时:设置 $btn.prop('disabled', true).text('加载中...');
  • 完成后:用缓存的 originalText 恢复,别硬写字符串

用 Bootstrap 5 的 spinner 组件增强视觉反馈

纯文字“加载中…”不够直观,Bootstrap 5 提供了轻量 .spinner-border 和 .spinner-grow,需手动拼进按钮 HTML。注意:不能直接在按钮里写死 spinner —— 要动态插入/移除,否则 DOM 混乱。

典型错误是把 spinner 写成固定子元素,结果多次点击后 spinner 越叠越多;或没给 spinner 加 me-2 类,导致文字紧贴图标难看。

VPS Bootstrap
VPS Bootstrap

从零启动全新 VPS,完成 OpenClaw 完整部署,包括备份/恢复及恢复后验证。用于 OpenClaw 部署。

下载
  • 推荐结构:<button><span class="spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span>加载中...</button>
  • JS 中用 $btn.html(...) 替换整个 innerHTML,而不是 .append()
  • 恢复时必须还原原始 HTML(含空格和换行),建议用 data-original-html 存原始内容
  • 加 role="status" 和 aria-hidden="true" 避免屏幕阅读器误读

避免 Promise.then 里忘记恢复按钮状态

异步操作(如 fetch 或 axios)成功后必须显式恢复按钮,否则用户卡在 Loading 状态。很多人只处理了 .then,漏掉 .catch —— 错误发生时按钮就永远 disabled 了。

更隐蔽的问题是:用了 async/await 却在 try 外写恢复逻辑,导致异常抛出后根本走不到恢复代码。

  • 必须把恢复逻辑放在 finally 块里,确保无论成功失败都执行
  • 示例:
    btn.prop('disabled', true).html(spinnerHtml);<br>try {<br>  await fetch('/api/submit');<br>} finally {<br>  btn.prop('disabled', false).html(originalHtml);<br>}
  • 如果用 .then().catch(),两个分支都要调恢复函数,别偷懒只写一个
  • 别在恢复前做耗时操作(比如弹 Toast),否则按钮解锁延迟明显

移动端点击穿透与防抖干扰

在 iOS 或某些安卓 WebView 里,快速连点可能触发两次请求,尤其当按钮恢复太快、用户没感知到已解锁时。这不是 Bootstrap 的问题,但和 Loading 状态实现强相关。

单纯加 disabled 不足以杜绝,因为 touch 事件和 click 事件冒泡时机不同,有时禁用还没生效就又进来了。

  • 在绑定点击事件时,加一层简单节流:if (btn.prop('disabled')) return; 放在最开头
  • 避免用 setTimeout 模拟 loading(比如 1 秒后自动恢复),真实接口可能更快或更慢,造成体验割裂
  • 慎用第三方防抖库包装按钮事件 —— 很可能和 disabled 状态冲突,反而让按钮“点不动”
  • 真要兼容弱网,Loading 状态至少保持 300ms,防止闪一下就恢复,用户误以为没点上
实际最难把握的是「恢复时机」和「视觉一致性」:接口返回快时 Loading 太短看不见,慢时又怕用户以为卡死。最好配合骨架屏或全局 loading bar,单个按钮的 Loading 只是辅助信号。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

bootstrap

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

2026.03.18

725

21

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

2026.03.18

199

9

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

热门下载

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

精品课程

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

共0课时 | 0人学习

Bootstrap Components 组件文档
Bootstrap Components 组件文档

共0课时 | 0人学习

Bootstrap Grid 栅格系统
Bootstrap Grid 栅格系统

共0课时 | 0人学习