JQuery проверить правило только на отправку - PullRequest
27 голосов
/ 10 марта 2011

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

Итак, форма Validate - это плагин для меня.

$("#form").validate({
    rules: {
       citystate: {
           required: true,
           myCustomAjaxSyncronousCheckAgainstDBRule: true
       }

    submitHandler: function(form) {
        if ($("#form").valid()) {
            form.submit();
        }
    }
});

Теперь скажем, что эту форму нужно использовать в 4 разных местах на моем сайте, так что было бы отстой, чтобы изменить рефакторинг myCustomAjaxSyncronousCheckAgainsDBRuleПоддельное имя, кстати) и иметь один и тот же код 4 раза по всему моему сайту.Вот почему я создал собственное правило в файле JS.Но есть ли способ, что правило МОЖЕТ быть проверено ТОЛЬКО во время отправки.Поскольку, если есть неверный пользовательский ввод, он будет проверять его при КАЖДОМ нажатии клавиши, что может быть довольно громоздким.Тем более, что у меня jQuery.ui.autocomplete работает недосказанность.

Ответы [ 6 ]

33 голосов
/ 10 марта 2011

Все проверки могут быть установлены независимо (onclick, onkeypress, onsubmit и т. Д.)

Демонстрации и подробности доступны на сайте документации. http://docs.jquery.com/Plugins/Validation/validate

<code>
$("#form").validate({
   onkeyup: false,
   onclick: false
})
10 голосов
/ 13 февраля 2015

В качестве альтернативы более простым способом можно передать функцию в настройки onfocusout и onkeyup jquery.validator, чтобы решить, должен ли элемент проверяться в этих событиях или нет, как это:1003 *

jQuery.validator.defaults.onfocusout = function (element, event) {
    // detectect if is the element you dont want validate
    // the element has to have the attribute 'data-control="mycitycontrol"'
    // you can also identify your element as you please
    if ($(element).data("control") === "mycitycontrol") return;
    if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {
        this.element(element);
    }
}
jQuery.validator.defaults.onkeyup = function (element, event) {
    // detectect if is the element you dont want validate
    // the element has to have the attribute 'data-control="mycitycontrol"'
    // you can also identify your element as you please
    if ($(element).data("control") === "mycitycontrol") return;
    if (event.which === 9 && this.elementValue(element) === "") {
        return;
    } 
    else if (element.name in this.submitted || element === this.lastElement) {
        this.element(element);
    }
}
9 голосов
/ 21 октября 2011
$.extend($("#form-id").validate().settings, { 
    onkeyup: false, 
    onfocusout: false 
});
6 голосов
/ 26 августа 2011

Если вы пытаетесь заставить определенный метод проверки запускаться ТОЛЬКО по событию submit, в то же время позволяя другим методам проверки запускаться нормально (например, по событию onkeyup), то вы можете динамически добавить правило при срабатывании события submit , затем удалите его после выполнения проверки. Порядок привязок важен; держать их в порядке.

$('#form').bind('submit', function(event) {
    $('#citystate').rules('add', {myCustomAjaxSyncronousCheckAgainstDBRule: true});
    event.preventDefault();
});

$('#form').validate({
    rules: {
        citystate: { required: true }
    }
});

$('#form').bind('submit', function(event) {
    $('#citystate').rules('remove', 'myCustomAjaxSyncronousCheckAgainstDBRule');
    event.preventDefault();
});
6 голосов
/ 10 марта 2011

Вот идея, которая может сработать: отдельно свяжите функцию keyup для вашего поля, на которой вы не хотите, чтобы событие keyup было проверено, и не имели пузыря:

$('#citystateID').bind('keyup',function(){
   return false; 
});

Я не мог 'Не могу понять, как связать определенные события валидатора (focusin и focusout), так что он будет по-прежнему запускать валидацию всякий раз, когда фокус покидает ваш ввод "citystate", но это ближе к тому, что вы хотели?

Я кратко проверил это здесь: http://jsfiddle.net/svUdp/, похоже, работал нормально (посмотрите на консоль, чтобы увидеть, что происходит - запускается много событий, но не так много проверок).

4 голосов
/ 20 августа 2014

$("#form").validate({ onfocusout: false, onkeyup: false, onclick: false });

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...