You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bootstrap 5表单验证事件监听器中页面跳转实现方法咨询

问题描述

我用纯JavaScript实现表单验证功能,直接参考Bootstrap 5的验证示例编写了以下代码:

// Loop over them and prevent submission
Array.from(forms).forEach((form) => {
  form.addEventListener(
    'submit',
    (event) => {
      if (!form.checkValidity()) {
        event.preventDefault()
        event.stopPropagation()
        console.log("!form.checkValidity()")
      } else {
        // save data, then redirect
        console.log("form.checkValidity()")
        // window.location.href="" and replace() don't work
      }

      form.classList.add('was-validated')

    },
    false
  )
})

验证功能正常运行,form.checkValidity() == true的分支也能正常触发,但验证通过并保存数据后,无法跳转到同站点的页面(比如page2.html),window.location.href和replace()都没有效果,请问问题出在哪里?

解决方案

问题核心是验证通过时,浏览器默认的表单提交行为会覆盖你的跳转逻辑——你只在验证不通过时阻止了默认提交,验证通过时没有阻止,导致浏览器优先执行表单提交,跳转代码根本没机会生效。

有两种可行的解决方式:

方式一:在验证通过分支中先阻止默认提交

else {
  event.preventDefault(); // 阻止默认表单提交
  // 执行数据保存逻辑
  console.log("form.checkValidity()");
  window.location.href = "page2.html"; // 跳转生效
}

方式二:全局阻止默认提交(推荐,适合无后端表单提交场景)

如果你的表单完全通过JavaScript处理数据,不需要浏览器默认的提交行为,可以在事件监听的最开头就阻止所有默认提交动作,再根据验证结果处理逻辑:

Array.from(forms).forEach((form) => {
  form.addEventListener(
    'submit',
    (event) => {
      // 先阻止所有默认提交和事件冒泡
      event.preventDefault();
      event.stopPropagation();

      if (!form.checkValidity()) {
        console.log("!form.checkValidity()");
      } else {
        // 数据保存逻辑
        console.log("form.checkValidity()");
        window.location.href = "page2.html";
      }

      form.classList.add('was-validated');
    },
    false
  )
})

内容的提问来源于stack exchange,提问作者Omortis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:20:20