Подтвердить что ты не робот

JQuery проверять правило ТОЛЬКО НА ОТПРАВКЕ

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

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

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

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

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

4b9b3361

Ответ 1

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

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);
    }
}

Ответ 2

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

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


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

Ответ 3

$.extend($("#form-id").validate().settings, { 
    onkeyup: false, 
    onfocusout: false 
});

Ответ 4

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

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

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

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

Ответ 5

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

$('#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

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