
在web开发中,我们经常需要在用户完成某个操作(如表单提交)后提供即时反馈。bootstrap的alert组件是一个常用的选择,它提供了一种简洁美观的提示方式。然而,当开发者尝试将一个bootstrap alert用作可重复使用的成功提示(例如,每次表单提交成功后都显示一次),可能会遇到一个常见的问题:alert只显示一次,之后无论如何触发,它都不会再次出现,除非刷新页面。
这个问题的根源在于Bootstrap Alert的默认关闭机制。当Alert组件的关闭按钮(通常是一个带有data-bs-dismiss="alert"属性的<button>元素)被点击时,Bootstrap的JavaScript会执行一个操作:它不仅会隐藏Alert,还会将整个Alert元素从DOM(文档对象模型)中完全移除。一旦元素被移除,它就不再是页面结构的一部分,自然无法再次显示。
以下是一个典型的初始HTML和JavaScript代码示例,展示了导致此问题的情况:
初始HTML (Alert组件):
<div class="alert my-alert alert-warning alert-dismissible fade show d-none" role="alert"> <strong>感谢!</strong> 您的消息已收到。 <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div>
初始JavaScript (表单提交逻辑):
const scriptURL = 'https://script.google.com/macros/......'; // 您的Google Apps Script URL
const form = document.forms['portofolio-contact-form'];
const myAlert = document.querySelector('.my-alert'); // 选择Alert元素
const btnKirim = document.querySelector('.my-btn'); // 提交按钮
const btnLoading = document.querySelector('.btn-loading'); // 加载状态按钮
form.addEventListener('submit', e => {
  e.preventDefault(); // 阻止表单默认提交行为
  btnLoading.classList.toggle('d-none'); // 显示加载状态
  btnKirim.classList.toggle('d-none');   // 隐藏提交按钮
  fetch(scriptURL, { method: 'POST', body: new FormData(form) })
    .then(response => {
      btnLoading.classList.toggle('d-none'); // 隐藏加载状态
      btnKirim.classList.toggle('d-none');   // 显示提交按钮
      myAlert.classList.toggle('d-none');    // 显示Alert (移除d-none)
      form.reset(); // 重置表单
      console.log('Success!', response);
    })
    .catch(error => console.error('Error!', error.message));
});在这段代码中,当表单成功提交后,myAlert.classList.toggle('d-none')会移除d-none类,使Alert显示。然而,一旦用户点击Alert上的关闭按钮,由于data-bs-dismiss="alert"的存在,Alert元素会被从DOM中移除,导致后续提交无法再次显示它。
要解决这个问题,我们需要阻止Bootstrap的默认移除行为,转而使用自定义的JavaScript来控制Alert的显示和隐藏。核心思路是:
下面是修改后的HTML和JavaScript代码:
修改后的HTML (Alert组件):
<div class="alert my-alert alert-warning alert-dismissible fade show d-none" role="alert">
    <strong>感谢!</strong> 您的消息已收到。
    <!-- 移除 data-bs-dismiss="alert",添加 onclick 事件 -->
    <button type="button" class="btn-close" onclick="hideMyAlert()" aria-label="Close"></button>
</div>修改后的JavaScript (表单提交及自定义关闭逻辑):
const scriptURL = 'https://script.google.com/macros/s/AKfycbzAovQklbPcjlV0Z0MAgTrvDR--cWl3mhWyfwcOneOcSbRPBnk_cSTCP2LOcUCiG5/exec'; // 您的Google Apps Script URL
const form = document.forms['portofolio-contact-form'];
const myAlert = document.querySelector('.my-alert'); // 选择Alert元素
const btnKirim = document.querySelector('.my-btn'); // 提交按钮
const btnLoading = document.querySelector('.btn-loading'); // 加载状态按钮
// 表单提交事件监听器
form.addEventListener('submit', e => {
    e.preventDefault(); // 阻止表单默认提交行为
    // 显示加载状态,隐藏提交按钮
    btnLoading.classList.toggle('d-none');
    btnKirim.classList.toggle('d-none');
    fetch(scriptURL, { method: 'POST', body: new FormData(form) })
        .then(response => {
            // 隐藏加载状态,显示提交按钮
            btnLoading.classList.toggle('d-none');
            btnKirim.classList.toggle('d-none');
            // 移除 'd-none' 类来显示 Alert
            myAlert.classList.remove('d-none');
            form.reset(); // 重置表单
            console.log('Success!', response);
        })
        .catch(error => console.error('Error!', error.message));
});
// 自定义函数:隐藏 Alert
function hideMyAlert() {
    myAlert.classList.add('d-none'); // 添加 'd-none' 类来隐藏 Alert
}HTML中的Alert关闭按钮:
JavaScript中的表单提交成功处理:
新增的JavaScript函数 hideMyAlert():
通过上述修改,您的Bootstrap Alert组件将能够在每次表单成功提交后正确显示,并在用户点击关闭按钮后隐藏,而不会被从DOM中移除,从而实现可重复使用的提示功能。
以上就是解决Bootstrap Alert只显示一次问题的教程的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号