Как отключить валидатор после завершения валидации? - PullRequest
0 голосов
/ 25 июня 2019

Я использую валидатор 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 голосов
/ 26 июня 2019

Ошибка «слишком много вызовов в стек» в консоли, возможно потому, что метод 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 уже предотвращает поведение по умолчанию действия отправки.

  3. $("#signupForm").submit вызывает вашу петлю ... форма действительна, поэтому submitHandler срабатывает, когда вы говорите, что она отправляется снова, вызывая повторный запуск submitHandler .... и т. Д. И т. Д.

  4. Последняя строка, $('#signupForm').submit(), должна быть form.submit().

См. этот раздел документации , в котором конкретно рассматривается созданный вами цикл рекурсии.

Другими словами ...

  • плагин jQuery Validate предотвращает отправку по умолчанию с помощью собственной функции submitHandler.

  • тогда вы бы запретили стандартную процедуру обработки отправки плагина jQuery Validate, заменив ее собственной пользовательской функцией submitHandler.

Возобновить нормальный поток плагинов, вызвав 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...