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
相关产品推荐
相关产品推荐

