解决Bootstrap 5表单提交后提示框(Alert)仅显示一次的问题

解决Bootstrap 5表单提交后提示框(Alert)仅显示一次的问题

本文详细阐述了在使用Bootstrap 5构建表单提交成功提示时,Alert组件仅显示一次的原因及解决方案。核心在于理解data-bs-dismiss属性的行为,并将其替换为自定义的JavaScript函数来控制Alert的显示与隐藏,确保每次提交后都能正确触发提示,提升用户体验。

在web开发中,尤其是在处理表单提交这类异步操作时,我们经常需要向用户提供即时反馈,例如通过一个弹出提示框(alert)告知用户操作成功或失败。bootstrap 5提供了一个方便的alert组件,但开发者在使用时可能会遇到一个常见问题:表单提交成功后,alert提示框首次能够正常显示,但关闭后再次提交表单,alert却不再出现,除非刷新页面。

问题根源:data-bs-dismiss=”alert” 的行为

这个问题的核心在于Bootstrap Alert组件的默认关闭行为。当一个Alert元素在其关闭按钮上带有data-bs-dismiss=”alert”属性时,Bootstrap的JavaScript机制会在用户点击该关闭按钮后,将整个Alert元素从DOM结构中完全移除。这意味着,一旦Alert被关闭,它就不再存在于页面上,因此后续的JavaScript操作(例如移除d-none类来显示它)将无法找到该元素,导致Alert无法再次显示。

以下是原始的HTML结构示例,其中包含导致此问题的data-bs-dismiss属性:

以及相应的JavaScript代码片段,它尝试在表单提交成功后显示Alert:

const myAlert = document.querySelector('.alert');// ... 其他代码 ...form.addEventListener('submit', e => {  e.preventDefault();  // ... 显示加载状态 ...  fetch(scriptURL, { method: 'POST', body: new FormData(form) })    .then(response => {      // ... 隐藏加载状态 ...      myAlert.classList.toggle('d-none'); // 首次有效,之后无效      form.reset();      console.log('Success!', response);    })    .catch(error => console.error('Error!', error.message));});

当Alert第一次显示并被用户点击关闭后,myAlert引用的DOM元素会被移除。再次提交表单时,myAlert.classList.toggle(‘d-none’)操作将对一个不存在的元素执行,自然无法达到预期效果。

解决方案:自定义Alert的关闭逻辑

要解决此问题,我们需要改变Alert的关闭行为:不再让Bootstrap完全移除Alert元素,而是通过JavaScript手动控制其显示与隐藏状态。

1. 修改HTML结构

首先,从Alert的关闭按钮中移除data-bs-dismiss=”alert”属性。取而代之,添加一个onclick事件,指向一个自定义的JavaScript函数,该函数将负责隐藏Alert。

这里我们将onclick事件绑定到hideMyAlert()函数。

2. 调整JavaScript逻辑

接下来,我们需要在JavaScript中实现两个关键点:

在表单提交成功后,明确地移除d-none类来显示Alert。实现hideMyAlert()函数,当用户点击关闭按钮时,该函数会重新添加d-none类来隐藏Alert,而不是将其从DOM中移除。

以下是完整的JavaScript代码示例:

const scriptURL = 'https://script.google.com/macros/s/AKfycbzAovQklbPcjlV0Z0MAgTrvDR--cWl3mhWyfwcOneOcSbRPBnk_cSTCP2LOcUCiG5/exec'; // 替换为你的实际URLconst form = document.forms['portofolio-contact-form'];const myAlert = document.querySelector('.my-alert'); // 使用更具体的类选择器确保选中正确的Alertconst btnKirim = document.querySelector('.my-btn');const btnLoading = document.querySelector('.btn-loading');// 表单提交事件监听器form.addEventListener('submit', e => {    e.preventDefault(); // 阻止表单默认提交行为    // 显示加载状态,隐藏提交按钮    btnLoading.classList.remove('d-none');    btnKirim.classList.add('d-none');    // 发送数据到Google Apps Script    fetch(scriptURL, { method: 'POST', body: new FormData(form) })        .then(response => {            // 隐藏加载状态,显示提交按钮            btnLoading.classList.add('d-none');            btnKirim.classList.remove('d-none');            // 移除 d-none 类以显示Alert            myAlert.classList.remove('d-none');            form.reset(); // 重置表单            console.log('Success!', response);        })        .catch(error => {            console.error('Error!', error.message);            // 错误时也要恢复按钮状态            btnLoading.classList.add('d-none');            btnKirim.classList.remove('d-none');            // 可以考虑显示一个错误提示        });});// 自定义函数:隐藏Alertfunction hideMyAlert() {    myAlert.classList.add('d-none'); // 添加 d-none 类以隐藏Alert}

代码解释:

在fetch请求成功的回调中,我们使用myAlert.classList.remove(‘d-none’)来确保Alert被显示。我们定义了一个全局函数hideMyAlert(),它负责在用户点击Alert的关闭按钮时,通过myAlert.classList.add(‘d-none’)来隐藏Alert。这样,Alert元素始终存在于DOM中,只是通过CSS的d-none类来控制其可见性。

注意事项与最佳实践

选择器精确性: 在document.querySelector(‘.my-alert’)中,使用my-alert这个更具体的类名可以避免意外选中页面上其他Alert组件。错误处理: 在catch块中,除了记录错误,还应该考虑向用户显示一个错误提示,并恢复表单按钮的状态,以提供更好的用户体验。动画效果: Bootstrap的fade和show类仍然可以用于提供Alert的淡入淡出动画效果,即使我们自定义了关闭逻辑。可访问性: aria-label=”Close”属性对于屏幕阅读器用户至关重要,它提供了关闭按钮的语义描述。模块化: 对于更复杂的应用,可以将hideMyAlert函数封装到更大的模块或类中,以保持代码的组织性。

总结

通过移除data-bs-dismiss=”alert”属性并实现自定义的JavaScript函数来控制Alert的显示与隐藏,我们成功解决了Bootstrap Alert在表单提交后仅显示一次的问题。这种方法确保了Alert元素在DOM中的持久存在,从而可以在每次表单成功提交后重复使用,极大地提升了用户体验和界面的响应性。这种对组件底层行为的理解和定制是前端开发中解决特定UI交互问题的关键。

以上就是解决Bootstrap 5表单提交后提示框(Alert)仅显示一次的问题的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1580185.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CSS相邻兄弟选择器与DOM顺序:实现浮动标签的焦点样式
上一篇 2025年12月22日 21:15:18
想让文字倾斜或加粗怎么办?EM和STRONG标签的语义化应用。
下一篇 2025年12月22日 21:15:26

相关推荐

  • laravel怎么在模型中定义远程一对一或一对多关系_laravel模型远程关联定义方法

    使用 hasManyThrough 和 hasOneThrough 可在 Laravel 中实现通过中间模型访问远端数据,需确保外键正确或自定义键名以维持关联完整性。 如果您需要在 Laravel 模型中访问通过中间模型关联的远端数据,但两个模型之间没有直接关系,而是通过第三个模型连接,则可以使用“…

    2026年9月24日
    000
  • MAC系统怎么开启防火墙_MAC开启防火墙教程

    1、建议在Mac系统中开启防火墙以提升网络安全,可通过“系统设置”中的“网络-防火墙”选项启用;2、高级用户可使用终端命令sudo /usr/libexec/ApplicationFirewall/socketfilterfw –setglobalstate on开启服务;3、启用后可在…

    2026年9月24日
    100
  • VSCode的扩展设置是全局的还是局部的?

    VSCode扩展设置默认全局生效,存储于用户配置文件中,但部分扩展如ESLint、Prettier和Python支持项目级局部配置,通过在项目根目录的.vscode/settings.json文件中定义,可覆盖全局设置;在设置界面中,齿轮图标表示可被工作区覆盖,锁图标表示仅限全局修改,用户可根据需求…

    2026年9月24日
    200
  • laravel怎么配置Octane并选择Swoole或RoadRunner_laravel Octane Swoole/RoadRunner配置方法

    Laravel Octane通过Swoole或RoadRunner提升应用性能,需安装扩展包并发布配置文件;选择Swoole需安装PHP扩展并设置driver为’swoole’,启动服务时可加–watch实现热重载;选择RoadRunner则自动安装二进制文件,配…

    2026年9月24日
    100
  • 如何在iPhone8设置密码?为老款iPhone设置安全锁的完整指南

    答案:在iPhone 8上设置密码需进入“设置”→“触控 ID 与密码”→“打开密码”,并选择6位、4位、自定义数字或字母数字密码以提升安全性,推荐使用复杂密码并开启触控 ID;如需更改密码,进入相同菜单选择“更改密码”并重新输入新密码,若要关闭密码,可点击“关闭密码”但会降低安全性;若忘记密码,唯…

    2026年9月24日
    100
  • Java Map.entrySet遍历性能优化

    使用增强for循环遍历Map.entrySet()更高效,避免显式声明Iterator;提前缓存key和value减少重复调用;优先选用HashMap提升性能;大数据量可考虑parallelStream并行处理,但需权衡开销。 在Java中,Map.entrySet() 是遍历键值对最常用的方式之一…

    2026年9月24日
    100
  • VSCode 如何自定义编辑器的选中内容动画效果 VSCode 选中内容动画效果的自定义创意方法​

    首先可通过修改settings.json中的workbench.colorcustomizations来自定义选中颜色,1. 添加”editor.selectionbackground”设置背景色,2. 添加”editor.selectionforeground&…

    2026年9月24日
    700
  • Java泛型擦除机制对对象类型的影响

    泛型擦除使Java在编译后移除类型信息,导致运行时无法判断具体泛型类型,影响类型检查、反射获取及继承多态,需通过桥接方法等机制保证一致性。 Java的泛型擦除机制在编译期会移除泛型类型信息,导致运行时无法获取具体的泛型参数类型。这一机制直接影响了对象类型的判断、反射操作以及继承中的类型处理。 泛型擦…

    2026年9月24日
    300
  • mac怎么分屏_mac分屏操作方法

    通过快捷键、拖拽或调整比例可高效使用Mac分屏功能。首先点击并按住绿色按钮选择窗口配对,或拖动窗口至屏幕边缘自动进入分屏;随后可调节分割线更改窗口比例;退出时点击顶部绿色按钮即可恢复普通模式。 如果您希望在使用 Mac 时提高多任务处理效率,可以通过分屏功能同时查看和操作两个应用程序。该功能允许用户…

    2026年9月24日
    300
  • PHP实时输出如何防止XSS攻击_PHP实时输出安全防范XSS攻击

    防止XSS攻击需坚持三重防护:首先对用户输入进行严格验证与白名单过滤,使用filter_var等函数校验数据格式;其次根据输出上下文进行恰当转义——HTML正文和属性用htmlspecialchars(),JavaScript变量用json_encode(),URL参数用urlencode();最后…

    2026年9月24日
    100
  • Java Optional.orElse与orElseGet区别

    orElse总是执行默认值计算,而orElseGet仅在Optional为空时调用Supplier获取,默认值构造 costly 时应优先使用orElseGet以避免性能浪费。 在 Java 8 引入的 Optional 类中,orElse 和 orElseGet 都用于在 Optional 值为空…

    2026年9月24日
    000
  • mac怎么更改shell_mac默认Shell修改方法

    首先通过系统偏好设置或chsh命令更改默认Shell,需确保新Shell已安装并注册至/etc/shells,必要时用Homebrew安装并配置对应配置文件。 如果您在使用Mac时希望更改默认的命令行解释器,可能是因为您想切换到更现代或功能更丰富的Shell环境。以下是完成此操作的步骤: 本文运行环…

    2026年9月24日
    200
  • Java中接口常量和类常量的使用区别

    接口常量默认public static final,用于行为契约但易导致职责模糊;类常量可用不同访问修饰符,更适合封装和维护。现代Java推荐使用专用常量类、枚举、私有静态常量或配置文件管理常量,以提升代码清晰度与可维护性。 Java中接口常量和类常量,核心区别在于它们的定义位置和隐式属性。接口常量…

    2026年9月24日
    000
  • 文字生成图片的AI工具2025十大好用推荐

    2025年热门AI文生图工具包括DALL-E 3、Midjourney、Stable Diffusion XL等,具备高图像质量、快速生成、强语义理解与精细风格控制,适用于不同用户需求,未来趋势指向更高清、更智能、更集成的创作生态。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使…

    2026年9月24日
    200
  • php数据如何实现文件断点续传_php数据大文件上传解决方案

    断点续传通过文件分片、唯一hash标识、服务端记录上传状态实现,前端切片上传并查询已传分片,PHP后端存储分片并在完成后合并,同时提供状态接口支持续传,需注意hash一致性与临时文件清理。 大文件上传在Web开发中是个常见需求,尤其是涉及视频、备份文件或资源包时。PHP本身对文件上传有一定限制,但通…

    2026年9月24日
    000
  • VS Code工作台UI:自定义CSS与视图容器配置

    可通过扩展和配置自定义VS Code UI:1. 使用Custom CSS and JS Loader注入CSS修改外观,但有风险;2. 推荐创建Color Theme扩展,通过JSON定义主题颜色;3. 利用viewsContainers在活动栏添加自定义容器;4. 用户可设置view.locat…

    2026年9月24日
    000
  • win11终端打不开或者闪退怎么办_win11终端无法打开或闪退修复方法

    先修复快捷方式,再重装应用,接着用SFC和DISM修复系统文件,最后重置终端应用。具体顺序:1、检查WinX菜单快捷方式并重建;2、卸载后从Microsoft Store重装Windows Terminal;3、以管理员身份运行sfc /scannow和DISM命令修复系统;4、在设置中重置终端应用…

    2026年9月24日
    100
  • OOP中的继承机制在Java中是如何运作的

    Java通过extends实现继承,子类可复用父类属性和方法,提升代码可维护性;支持方法重写与super调用,遵循单继承与访问控制规则,构造函数需显式调用父类构造器。 Java中的继承机制通过extends关键字实现,允许一个类(子类)获取另一个类(父类)的属性和方法。这种机制支持代码重用,提升程序…

    2026年9月24日
    100
  • PHP 中如何将 JSON 数组值声明为变量

    本文介绍了如何在 PHP 中从数据库获取数据并将其编码为 JSON 格式,然后通过 AJAX 请求传递到另一个页面。重点讲解了如何在接收页面解析 JSON 数据,并将 JSON 数组中的特定值提取并赋值给变量,以便在后续的 PHP 函数中使用。 从数据库获取数据并编码为 JSON 首先,我们需要从数…

    2026年9月24日
    000
  • 360浏览器怎么升级到最新版本 360浏览器版本更新升级操作指南

    建议及时升级360浏览器至最新版本以确保安全与性能,可通过浏览器内置更新、官网手动下载或应用商店三种方式完成升级操作。 如果您发现当前使用的360浏览器功能受限或存在兼容性问题,可能是由于版本过旧导致。为确保浏览安全与性能稳定,建议及时将浏览器升级至最新版本。 本文运行环境:华为Mate 60 Pr…

    2026年9月24日
    100

发表回复

登录后才能评论
关注微信