验证完成后如何禁用验证器?
How do I disable validator once validation is complete?
我在注册表中使用 jquery 验证器。我想在将密码发送到服务器之前对其进行加密。密码和确认密码都需要加密,这会导致验证器崩溃并在控制台中出现 "too many calls to stack" 错误,大概是因为在提交之前更新表单中的值时 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 函数开始时禁用验证器?
"too many calls to stack" error in the console, presumably because the onchange method is firing when I update the values in the form before submit
嗯,不。 submitHandler
内没有触发验证,因为此时表单 已被视为有效 。验证 仅 通过用户与表单的交互触发。以编程方式更改表单值无法触发验证,除非您也以编程方式触发验证。
How do I disable the validator at the start of the submitHandler function?
你不知道。您不需要在 submitHandler
开始时禁用验证,因为此时验证已 100% 完成。 submitHandler
.
不会触发额外的验证
让我们分解一下...
submitHandler: function(e) {
$("#signupForm").submit(function(e){
e.preventDefault();
});
// your encryption code here
$('#signupForm').submit();
}
您不能将 e
传递到 submitHandler
并期望插件接受它代表 "event"。在这方面没有事件。 form
是唯一接受的参数,它表示插件识别的表单对象。
submitHandler: function(form) {
e.preventDefault()
在 submitHandler
回调中完全没有意义,可能在这里什么也不做。另见第 1 项。submitHandler
回调函数已经阻止了提交操作的默认行为。
$("#signupForm").submit
导致你的循环...表单有效所以 submitHandler
触发,你告诉它再次提交导致 submitHandler
再次被触发....等等等等
最后一行 $('#signupForm').submit()
应该是 form.submit()
。
参见 this section of the documentation,它专门解决了您创建的递归循环。
换句话说...
jQuery 验证插件通过其自身的 submitHandler
函数阻止默认提交。
然后您将阻止 jQuery 验证插件的默认提交处理程序例程,方法是将其替换为您自己的自定义 submitHandler
函数。
通过在 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)
}
我在注册表中使用 jquery 验证器。我想在将密码发送到服务器之前对其进行加密。密码和确认密码都需要加密,这会导致验证器崩溃并在控制台中出现 "too many calls to stack" 错误,大概是因为在提交之前更新表单中的值时 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 函数开始时禁用验证器?
"too many calls to stack" error in the console, presumably because the onchange method is firing when I update the values in the form before submit
嗯,不。 submitHandler
内没有触发验证,因为此时表单 已被视为有效 。验证 仅 通过用户与表单的交互触发。以编程方式更改表单值无法触发验证,除非您也以编程方式触发验证。
How do I disable the validator at the start of the submitHandler function?
你不知道。您不需要在 submitHandler
开始时禁用验证,因为此时验证已 100% 完成。 submitHandler
.
让我们分解一下...
submitHandler: function(e) {
$("#signupForm").submit(function(e){
e.preventDefault();
});
// your encryption code here
$('#signupForm').submit();
}
您不能将
e
传递到submitHandler
并期望插件接受它代表 "event"。在这方面没有事件。form
是唯一接受的参数,它表示插件识别的表单对象。submitHandler: function(form) {
e.preventDefault()
在submitHandler
回调中完全没有意义,可能在这里什么也不做。另见第 1 项。submitHandler
回调函数已经阻止了提交操作的默认行为。$("#signupForm").submit
导致你的循环...表单有效所以submitHandler
触发,你告诉它再次提交导致submitHandler
再次被触发....等等等等最后一行
$('#signupForm').submit()
应该是form.submit()
。
参见 this section of the documentation,它专门解决了您创建的递归循环。
换句话说...
jQuery 验证插件通过其自身的
submitHandler
函数阻止默认提交。然后您将阻止 jQuery 验证插件的默认提交处理程序例程,方法是将其替换为您自己的自定义
submitHandler
函数。
通过在 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)
}