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

Как я могу добавлять, удалять или заменять правила проверки jQuery со страницы?

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


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

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

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

  • Вызов $("form").rules("remove") для удаления всех существующих правил проверки. Это исключает исключение JavaScript undefined.
  • Вызов $("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"
            }
        });
    }
});
4b9b3361

Ответ 1

Устаревшее уведомление:
Этот ответ относится к чрезвычайно старой версии плагина 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"
            }
        });
    }
});

Ответ 2

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

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

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

Ответ 3

"Обязательные" объявления внутри хэша 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"
              } }
  }
});

Ответ 4

$('#form_id').validate();//empty rules
//add rules/message to form element
$('#form_id #inputId').rules("add", {
    required        : true,                             
    messages        : {
        required    : 'Add your required message'
    }
});

Ответ 5

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

        $.editRules = function($array, $type) {
            var settings = $('#signupForm').validate().settings;
            $.each($array, function($k, $v) {
                settings.rules[$v] = {required: ($type == 'add' ? true : false)};
            });
        };

Ответ 6

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

Он пытается очистить проверку и отправить обработку совсем немного.


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

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


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

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

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