Как добавить, удалить или поменять правила проверки jQuery со страницы? - PullRequest
41 голосов
/ 02 октября 2009

Примечание:
Этот вопрос относится к очень старой версии jQuery.validate () (версия 1.5). Этот плагин теперь предоставляет встроенное решение для этого: метод .rules() , который следует использовать вместо этого. Я оставляю этот вопрос и отвечаю в его первоначальном виде для исторических целей всем, кому необходимо поддерживать устаревший сайт, который не может обновиться до последних версий jQuery и jQuery.validate ().


У меня есть форма, которая переключает видимые элементы ввода. Я хочу проверить только видимые элементы в форме.

Мне трудно заставить это работать правильно. Я хочу отключить валидаторы для невидимых элементов, и я не могу найти лучший способ сделать это. Любое понимание того, что может быть не так с моим кодом или мой подход, будет оценено.

Когда видимость переключается, я пробовал несколько вещей:

  • Вызов $("form").rules("remove") для очистки всех существующих правил проверки. Это вызывает «неопределенное» исключение JavaScript.
  • Вызов $("form").validation(...options...) для видимых элементов, в надежде, что это перезапишет правила. Это позволяет работать только первой проверенной группе. Вторая панель не может быть проверена.
  • Отмена привязки обработчика отправки перед вызовом нового validation() метода. Это не сделало то, что я бы подумал. Он удаляет все проверки (по-видимому) навсегда, и форма отправляется без проверки.
  • Очистка объекта валидации с помощью $.removeData($('form'), 'validator') перед повторной попыткой вызова валидатора. Это также не работает.
  • Это на сайте ASP.NET, поэтому об использовании нескольких тегов <form /> не может быть и речи, так как это сломало бы страницу.

Я как бы озадачен тем, как я могу заставить эту работу. Вы можете увидеть полную рабочую демонстрацию того, что у меня есть на http://jsbin.com/ucibe3, или отредактировать ее на http://jsbin.com/ucibe3/edit. Я попытался сократить его до просто кода, который вызывает ошибку.

Вот ключевые части моего кода (используйте ссылки выше для полной рабочей страницы)

HTML:

<td id="leftform">
    Left Form<br />
    Input 1: <input type="text" name="leftform_input1" /><br />
    Input 2: <input type="text" name="leftform_input2" /><br />
    <input type="submit" name="leftform_submit" value="Submit Left" />
</td>
<td id="rightform" style="visibility:hidden">
    Right Form<br />
    Input 1: <input type="text" name="rightform_input1" /><br />
    Input 2: <input type="text" name="rightform_input2" /><br />
    <input type="submit" name="rightform_submit" value="Submit Right" />
</td>

JavaScript:

$('#toggleSwitch').click(function() {
    if ($('#leftform').css("visibility") !== "hidden") {
        $('#leftform').css("visibility", "hidden");
        $('#rightform').css("visibility", "visible");
        $('form').validate({
            rules: {
                rightform_input1: { required: true },
                rightform_input2: { required: true }
            },
            messages: {
                rightform_input1: "Field is required",
                rightform_input2: "Field is required"
            }
        });
    } else {
        $('#rightform').css("visibility", "hidden");
        $('#leftform').css("visibility", "visible");
        $('form').validate({
            rules: {
                leftform_input1: { required: true },
                leftform_input2: { required: true }
            },
            messages: {
                leftform_input1: "Field is required",
                leftform_input2: "Field is required"
            }
        });
    }
});

Ответы [ 6 ]

69 голосов
/ 23 октября 2009

Устаревшее уведомление:
Этот ответ относится к чрезвычайно старой версии плагина jQuery.validate () (версия 1.5) и в настоящее время устарел, поскольку плагин предоставляет официальный API для решения этой проблемы. См. .rules() документацию для текущего подхода к решению этой проблемы. Я оставляю этот ответ «как есть», чтобы помочь любому, кто должен поддерживать устаревший сайт, который не может обновиться до последних версий jQuery и jQuery.validate ().


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

После инициализации валидатора jQuery вы можете снова получить доступ к объекту валидатора, вызвав метод validate() для объекта формы, к которому вы применили валидатор. Этот объект валидатора имеет свойство settings, в котором хранятся настройки по умолчанию в сочетании с настройками, примененными к нему при инициализации.

Предполагается, что я инициализирую валидатор следующим образом:

$('form').validate({
    rules: {
        leftform_input1: { required: true },
        leftform_input2: { required: true }
    },
    messages: {
        leftform_input1: "Field is required",
        leftform_input2: "Field is required"
    }
});

Затем я могу получить эти точные настройки из валидатора, выполнив следующие действия:

var settings = $('form').validate().settings;

Затем я могу легко работать с этим объектом настроек, чтобы добавлять или удалять валидаторы для формы.

Вот как бы вы удалили правила проверки:

var settings = $('form').validate().settings;
delete settings.rules.rightform_input1;
delete settings.messages.rightform_input1;

А вот как бы вы добавили правила проверки:

var settings = $('form').validate().settings;
settings.rules.leftform_input1 = {required: true};
settings.messages.leftform_input1 = "Field is required";

Вот рабочее решение для сценария в моем вопросе. Я использую метод jQuery extend(), чтобы перезаписать свойства rules и messages объекта validate, что позволяет переключаться между двумя панелями.

$('#toggleSwitch').click(function() {
    var settings = $('form').validate().settings;
    var leftForm = $('#leftform');
    var rightForm = $('#rightform');

    if (leftForm.css("visibility") !== "hidden") {
        leftForm.css("visibility", "hidden");
        rightForm.css("visibility", "visible");
        $.extend(settings, {
            rules: {
                rightform_input1: { required: true },
                rightform_input2: { required: true }
            },
            messages: {
                rightform_input1: "Field is required",
                rightform_input2: "Field is required"
            }
        });
    } else {
        rightForm.css("visibility", "hidden");
        leftForm.css("visibility", "visible");
        $.extend(settings, {
            rules: {
                leftform_input1: { required: true },
                leftform_input2: { required: true }
            },
            messages: {
                leftform_input1: "Field is required",
                leftform_input2: "Field is required"
            }
        });
    }
});
15 голосов
/ 12 декабря 2012

Если вы хотите позвонить, подтвердите снова с новыми настройками (правила, сообщения ... и т. Д.) звоните

$('#formid').removeData('validator')

Это удалит проверку формы, а затем инициализирует ее снова с новыми настройками

13 голосов
/ 10 октября 2009

«Требуемые» объявления внутри хеша validate.rules не обязательно должны быть статически объявлены как «истина». Вместо этого вы можете предоставить анонимную функцию, которая может проверять видимость чего-либо и возвращать true или false в зависимости от ответа.

$('form').validate({
rules: {
  rightform_input1: { 
    required: function(){
              return $('#leftform').css("visibility") !== "hidden"
              } },
  rightform_input2: {
    required: function(){
              return $('#leftform').css("visibility") !== "hidden"
              } }
  }
});
5 голосов
/ 01 марта 2012
$('#form_id').validate();//empty rules
//add rules/message to form element
$('#form_id #inputId').rules("add", {
    required        : true,                             
    messages        : {
        required    : 'Add your required message'
    }
});
4 голосов
/ 07 ноября 2012

Я написал небольшую функцию для редактирования правил (требуется только).

        $.editRules = function($array, $type) {
            var settings = $('#signupForm').validate().settings;
            $.each($array, function($k, $v) {
                settings.rules[$v] = {required: ($type == 'add' ? true : false)};
            });
        };
3 голосов
/ 02 октября 2009

Хотя есть и другие способы сделать это, ASP.net позволяет вам использовать несколько тегов форм, если они не все визуализируются - поэтому, если вы используете многократное представление только для отображения релевантного контента, вы можете использовать несколько форм.

Это имеет тенденцию очищать проверку и отправлять обработку довольно много.


В качестве альтернативы jquery разрешает добавление: visible к вашему селектору, так что вы можете потенциально запускать селектор только для видимых элементов и обходить проблему таким образом, в зависимости от того, как они скрыты.

Как: вычисляется значение visible, изменено в jQuery 1.3.2. Элемент считается видимым, если он и его родители занимают место в документе. Видимость CSS не учитывается. В примечаниях к выпуску изменения описаны более подробно.


Вот лучшее / более простое решение из другого сообщения о переполнении стека-

Видимо, плагин проверки позволяет вам указать: видимый в ваших правилах. Вот этот пост -

Расширенная проверка JQuery: предотвращение проверок при определенных условиях

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