2011-04-30 4 views
5

Я поставил свой тестовый код на jsfiddle. Пожалуйста, проверьте его hereПроверка формы jQuery: зачем проверять два раза?

Когда я нажал кнопку отправки, почему я получаю двухкратное предупреждение?

+0

Это не похоже на проблему. Вы не должны делать ничего в требуемой функции, кроме как просто проверить, что требуемые данные введены и действительны. Вы не знаете, сколько раз это будет вызвано. – AndrewR

+0

@AndrewR Я делаю много условной проверки, поэтому он НЕОБХОДИМО беспокоиться о том, как должна выполняться требуемая функция ... – Vikas

+0

Вы фактически меняете данные или что-то еще, что может привести к сбою второй проверки в случае, если вызов будет вызван более одного раза ? – AndrewR

ответ

0

Насколько я могу судить, это потому, что у вас есть кнопка типа «отправить». Поэтому проверка jQuery выполняется дважды; один раз, когда ввод текста теряет фокус, и снова, когда страница перезагружается. Если я ошибаюсь, я надеюсь, что кто-то меня исправит, но когда я сменил кнопку на кнопку «кнопка», двойное предупреждение, похоже, исчезнет.

HTH.

EDIT: Ну, похоже, что я был неправ, поэтому игнорируйте приведенный выше совет. Должно быть, это была временная причуда браузера, который я использовал.

+1

Я не понял, как это работает при смене типа отправки на кнопку –

+0

Вы очистили свой кеш? Возможно, вы работаете с кешированной версией вашего JavaScript. –

+0

@mahesh является правильным, если я вызываю метод form.valid(), то снова он предупреждает дважды. – Vikas

4

Вы неправильно используете функцию проверки подлинности и как пожелаете AndrewR. Есть много вещей, которые изменят количество раз, когда вызывающая функция вызывается. В вашем примере, «правило» (которая является функцией в вашем случае) вызывается на:

  • text1 теряет фокус (если значение изменилось)
  • кнопка отправки нажата
  • форма представила
  • б/у

Это правильное выражение, так как хорошая проверка покажет вам ошибки в поле, которое вы только что отредактировали, когда вы его удалите, а также ряд других событий.

Если вы хотите выполнять функции проверки правильности определенного поля, лучше применять обратный вызов OnValidating для запуска ваших настраиваемых методов в поле. Правила должны быть просто правилами, а не методами, для чего нужны обратные вызовы (и да, обратный вызов также будет выполняться несколько раз, потому что многие события запускают метод проверки).

Если вам действительно это нужно стрелять только один раз и только на форме представить, а затем отключить поведение проверки по умолчанию и добавить вручную Validate() вызов, как следующее:

$("#test1").submit(function() { 
    $("#test1").validate(); 
}); 

Flat на данный момент, но я могу вернуться и представить пример этого, если вам это нужно.

PS: Еще один известный способ получения двойных событий - это связать событие дважды. Если вы не знаете, как страницы будут инициализированы, то часто бывает безопаснее «отвязать» событие, прежде чем связывать его. Это определенно не проблема в вашем случае, но может возникнуть, когда вы попытаетесь исправить свою проблему и можете вызвать путаницу - у меня это было в прошлом :)

1

Это не ответ, это обходной путь ,

Поскольку это первый результат, который появился в Google, я собираюсь опубликовать его, даже если вам, вероятно, больше не нужен ответ.

Я также использую jQuery и плагин проверки jQuery. В одном из моих правил я запускал код ajax и, будучи новичком ajax, я поставил предупреждение, чтобы я мог видеть, что происходит под капотом.

Предупреждение срабатывало дважды, что было проблемой, потому что это в два раза больше трафика, который мне действительно нужен. Поэтому я начал искать в Интернете по причине/решению. Я знал, что хочу сохранить onfocusout валидацию, поэтому я отключал ее как можно дольше.

Когда я, наконец, обрушился и отключил его, вот что я узнал. Отключение onfocusout на самом деле не отключает эту функцию, но она не позволяет ей дважды стрелять. Начиная мой код проверки с этим ...

$("#FORMNAME").validate({ 
    onkeyup: false, 
    onfocusout: false, 

... фактически не остановить проверку от стрельбы после того, как я нажал кнопку первый раз представить, что реалистично, что я хотел; щелкнуть, увидеть проблемы, устранить проблемы и увидеть их обновление, когда пользовательские вкладки или щелчки. ЭТО все еще работало красиво, и дополнительные оповещения исчезли.

Мне очень хотелось бы знать, что там происходит, но я просто рад видеть, что это работает. Предположительно, что-то в проверке onfocusout противоречило обычным правилам post-submit-button jQuery validate, и в два раза повышало допустимость проверки.

(Да, эта информация, возможно, в документации, но не стесняйтесь направлять ваши комментарии RTFM в другом месте, пожалуйста.)

tldr: Отключить OnKeyUp и onfocusout, и все предупреждения будут только стрелять один раз. Вы не потеряете столько функциональности, как ожидаете.

Смежные вопросы