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

时间:2019-06-25 15:56:59

标签: jquery jquery-validate

我在注册表单中使用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函数开始时禁用验证器?

1 个答案:

答案 0 :(得分:0)

  控制台中的

“堆栈调用过多”错误,大概是因为在我提交之前更新表单中的值时,onchange方法正在触发

submitHandler内部没有触发任何验证,因为此时表单已被视为有效。验证仅通过用户与表单的交互触发。除非您还以编程方式触发验证,否则以编程方式更改表单值将无法触发验证。

  

如何在SubmitHandler函数开始时禁用验证器?

你不知道。您无需在submitHandler开始时禁用验证,因为此时验证已100%完成。 submitHandler不会触发其他验证。

让我们分解一下...

submitHandler: function(e) {
    $("#signupForm").submit(function(e){
        e.preventDefault();
    });
    // your encryption code here
    $('#signupForm').submit();
}
  1. 您不能将e传递到submitHandler并期望插件接受它来表示“事件”。在这种情况下没有事件。 form是唯一接受的参数,它表示插件可以识别的表单对象。

    submitHandler: function(form) {
    
  2. e.preventDefault()submitHandler回调中绝对没有意义,并且在这里可能什么也不做。另请参阅第1条。submitHandler回调函数已经在阻止Submit操作的默认行为。

  3. $("#signupForm").submit导致您的循环...该表格有效,因此submitHandler被触发,您告诉它再次提交,导致submitHandler被再次触发。...等。

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