我在注册表单中使用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();
}
} );
如何在SubmitHandler函数开始时禁用验证器?
答案 0 :(得分:0)
控制台中的“堆栈调用过多”错误,大概是因为在我提交之前更新表单中的值时,onchange方法正在触发
嗯submitHandler
内部没有触发任何验证,因为此时表单已被视为有效。验证仅通过用户与表单的交互触发。除非您还以编程方式触发验证,否则以编程方式更改表单值将无法触发验证。
如何在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
回调函数已经在阻止Submit操作的默认行为。
$("#signupForm").submit
导致您的循环...该表格有效,因此submitHandler
被触发,您告诉它再次提交,导致submitHandler
被再次触发。...等。
最后一行$('#signupForm').submit()
应该是form.submit()
。
请参见this section of the documentation,该文档专门解决了您创建的递归循环。
换句话说...
jQuery Validate插件正在通过其自己的submitHandler
函数阻止默认提交。
然后您将使用自己的自定义submitHandler
函数替换jQuery Validate插件的默认提交处理程序例程。
通过在form.submit()
函数末尾调用submitHandler
恢复正常的插件流程。 (或者,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)
}