AJAX校验通过后调用$(form).submit()无法触发表单提交问题
问题根因
表单无法提交的核心原因有两个:
- jQuery封装的
$form.submit()方法触发逻辑存在兼容问题:调用该方法时会先执行所有绑定在表单上的submit事件回调,再判断是否执行原生提交。你的逻辑中首次提交时调用了e.preventDefault()阻止默认提交,后续ajax校验完成后通过jQuery触发submit事件,虽然能进入校验通过分支打印validated日志,但jQuery内部的默认行为标记没有被正确重置,最终不会触发原生表单提交请求,控制台也不会报任何错误。 - 代码存在逻辑疏漏:
if ($validate.length==0)判断块未添加大括号,导致仅第一行append隐藏域的逻辑受if条件控制,后续的字段查找、参数序列化、ajax请求逻辑,无论_validate字段是否存在都会执行,会造成无意义的逻辑重复运行。
修复方案
校验通过后直接调用原生DOM的submit方法即可,原生方法不会触发绑定的jQuery submit事件,会直接执行表单提交动作,同时补上if块的大括号修正逻辑:
$(document).ready(function(){ $('form[action*="#validate"]').on('submit', function(e){ var $form = $(this); var $submit = $form.find('input[type=submit]'); var $validate = $form.find('input[name=_validate]'); if ($validate.length>0 && $validate.val()=='success') { console.log('validated'); return true; } e.preventDefault(); // 补上大括号,仅在_validate字段不存在时执行新增逻辑 if ($validate.length==0) { $form.append('<input type="hidden" name="_validate" value="asking" />'); $validate = $form.find('input[name=_validate]'); } var params = $form.serialize(); $.ajax({ url: $form.attr('action'), method: $form.attr('method').toLowerCase(), data: params }) .then(function(response, statusText, xhrObj){ var json = JSON.parse(response); if (json._status!='ok') { // 写入校验错误提示逻辑 } else { $validate.val('success'); $form.attr('action', $form.attr('action').replace('#validate', '')); // 替换为原生DOM submit方法,直接触发提交,不重复走jQuery事件绑定 $form[0].submit(); } }); }); });
额外注意:请确保表单内的提交按钮(type=submit的input/button)的id和name都不要设置为
submit,否则会覆盖表单原生的submit方法,同样会导致提交失效。
内容的提问来源于stack exchange,提问作者zzmaster
相关产品推荐
相关产品推荐

