验证完成后如何禁用验证器?

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();
}
  1. 您不能将 e 传递到 submitHandler 并期望插件接受它代表 "event"。在这方面没有事件。 form 是唯一接受的参数,它表示插件识别的表单对象。

    submitHandler: function(form) {
    
  2. e.preventDefault()submitHandler 回调中完全没有意义,可能在这里什么也不做。另见第 1 项。submitHandler 回调函数已经阻止了提交操作的默认行为。

  3. $("#signupForm").submit 导致你的循环...表单有效所以 submitHandler 触发,你告诉它再次提交导致 submitHandler 再次被触发....等等等等

  4. 最后一行 $('#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)
}