我在注册表单中使用jquery验证器。 我想在将密码发送到服务器之前对其进行加密。 密码和确认密码都需要加密,这会导致验证器崩溃并在控制台中出现"太多调用堆叠"错误,大概是因为当我在提交之前更新表单中的值时,onchange 方法正在触发......
$.validator.setDefaults( {
submitHandler: function(e) {
$("#signupForm").submit(function(e){
e.preventDefault();
});
var hp = $('#password').val();
var hc = $('#passwordConfirm').val();
var hb = $('#heartbeat').val();
hp = CryptoJS.SHA384(hp);
hp = CryptoJS.SHA384(hp + hb);
hc = CryptoJS.SHA384(hc);
hc = CryptoJS.SHA384(hc + hb);
$('#password').val(hp);
$('#passwordConfirm').val(hc);
$('#signupForm').submit();
}
} );
如何在提交处理程序函数开始时禁用验证器?
>"太多调用无法堆叠"错误,可能是因为在提交之前更新表单中的值时触发了onchange方法。
嗯没有。submitHandler
内不会触发验证,因为此时表单已被视为有效。 验证仅通过用户与表单的交互触发。 以编程方式更改表单值无法触发验证,除非您也以编程方式触发验证。
如何在提交处理程序函数开始时禁用验证器?
你没有。 您无需在submitHandler
开始时禁用验证,因为此时验证已 100% 完成。submitHandler
不会触发其他验证。
让我们分解一下...
submitHandler: function(e) {
$("#signupForm").submit(function(e){
e.preventDefault();
});
// your encryption code here
$('#signupForm').submit();
}
您不能将
e
传递到submitHandler
并期望插件接受它作为表示"事件"的依据。 这方面没有事件。form
是唯一接受的参数,它表示插件识别的表单对象。submitHandler: function(form) {
e.preventDefault()
在submitHandler
回调中完全没有意义,并且可能在这里什么都不做。 另见第1项。submitHandler
回调函数已阻止提交操作的默认行为。$("#signupForm").submit
导致您的循环... 表单是有效的,所以submitHandler
触发,你告诉它再次提交,导致submitHandler
再次被触发......等等。最后一行
$('#signupForm').submit()
应为form.submit()
。
请参阅文档的这一部分,其中专门介绍了您创建的递归循环。
换句话说...
jQuery 验证插件通过自己的
submitHandler
函数阻止默认提交。然后,您将通过将其替换为您自己的自定义
submitHandler
函数来阻止 jQuery 验证插件的默认提交处理程序例程。
通过在submitHandler
函数结束时调用form.submit()
来恢复正常的插件流。 (或者,可以在此处将form.submit
替换为 Ajax 提交。
整个事情应该这么简单...
submitHandler: function(form) { // <- note the "form" argument
// below replaces default submitHandler callback
// form is valid here - no validation is triggered
// your encryption code here
form.submit(); // now submit data (does not call submitHandler or new validation)
}