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

jQuery实现仅当条件满足时提交表单,不受状态反复切换影响

问题根源

你写的逻辑不生效是两个核心写法错误导致的:

  • submit 事件的触发对象是 <form> 表单元素,不是type为submit的按钮。你把提交监听绑定在按钮上,对应的阻止默认提交逻辑根本不会执行。
  • 不需要在点击按钮时动态绑定、解绑提交事件,这种写法很容易出现事件残留、状态判断不同步的问题。只要在表单提交触发的瞬间做一次状态校验,就能保证每次判断取的都是点击提交那一刻的最新状态,不管复选框之前切换过多少次选中/取消。
修正实现

首先确保你的提交按钮外层包裹了<form>标签,给表单加个id方便绑定事件即可,原有CSS和自定义复选框的点击切换逻辑不需要改动。
修正后的JS代码:

$(document).ready(function () {
    // 自定义复选框切换选中样式,用$(this)指代当前点击元素更稳妥
    $("#checkbox").click(function () { 
        $(this).toggleClass("checked");
    });

    // 提交事件绑定在表单元素上
    $("#submitForm").submit(function (e) {
        // 提交瞬间校验复选框状态,未选中则直接阻止提交
        if (!$("#checkbox").hasClass("checked")) {
            e.preventDefault();
            // 可在此处添加未勾选的提示,比如弹窗提示
            // alert("请先勾选同意隐私政策再提交");
        }
    });
});

对应调整后的HTML结构(仅补充外层form标签,其余原有内容保留):

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- 补充外层form标签,替换成你实际的提交地址和请求方式 -->
<form id="submitForm" action="" method="post">
  <div class="politicaP">
      <div id="checkbox" class="checkbox"></div>
      <div class="textoPolitica">
          <p>Acepto la <a href="politica">Politica de Privacidad</a>.</p>
          <p>Tus datos no serán guardados, cedidos o comunicados, ni por nosotros ni por terceras personas</p>
      </div>
  </div>
  <button id="bttnEnviar" type="submit" class="bttnFormulario">Enviar</button>
</form>

原有CSS代码不需要做任何修改,自定义复选框的样式会正常生效。

补充说明
  • 这个写法会拦截所有触发表单提交的操作,包括点击提交按钮、输入框按回车提交等场景,不会有漏判。
  • 如果你不想给表单加id,也可以通过提交按钮向上查找最近的form元素绑定事件,写法为$("#bttnEnviar").closest("form").submit(function(e){ ... }),效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:39:42