Проверка jQuery: динамическое изменение правил - PullRequest
45 голосов
/ 09 ноября 2010

У меня есть одна форма, которая, в зависимости от того, какая радио-кнопка нажата (Войти или Зарегистрироваться), отображает:

  • адрес электронной почты
  • пароль

или:

  • имя
  • возраст
  • адрес электронной почты
  • пароль

Нажатие на радиокнопка переключает видимость полей Логин / Регистрация:

<form id="myForm">
    <input name="userAction" type="radio" value="login" checked="checked">Login</input>
    <br />
    <input name="userAction" type="radio" value="signup">Sign Up</input>

    <div id="loginFields" style="display:none">
        <!-- Login fields (email address and password) -->
    </div>

    <div id="signupFields" style="display:none">
        <!-- Signup fields (name, age, email address, password) -->
    </div>
</form>

Я использую плагин Проверка jQuery , и я хотел бы использовать следующие правила:

var signupRules = {
    emailAddressTextBox:
    {
        required: true,
        email: true 
    },
    passwordTextBox:
    {
        required: true,
        minlength: 6,
        maxlength: 24,
        passwordValidationRule: true // custom regex added with $.validator.addMethod()
    }
};

var loginRules = {
    nameTextBox:
    {
        required: true,
        maxlength: 50
    },
    loginEmailAddressTextBox:
    {
        required: true,
        email: true 
    },
    loginPasswordTextBox:
    {
        required: true,
        minlength: 6,
        maxlength: 24,
        passwordValidationRule: true // custom regex added with $.validator.addMethod()
    },
    loginPasswordAgainTextBox:
    {
        required: true,
        minlength: 6,
        maxlength: 24,
        equalTo: "#loginPasswordTextBox"
        passwordValidationRule: true // custom regex added with $.validator.addMethod()        
    }
};

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

   $("input[name='userAction']").change(function() {
        if ($("input[name='userAction']:checked" ).val() === "login") {
            // use loginRules
        } else {
            // use signupRules
        }
    });

Я пробовал следующее:

$("#myForm").validate({
    rules: ($("input[name='userAction']:checked" ).val() === "login") ? loginRules : signupRules;
});

Но так как мои поля Логин являютсяпо умолчанию отображается, его проверки работают, но сценарий регистрации не работает;по какой-то причине он хочет проверить поля Login.Я что-то упустил?

Ответы [ 10 ]

55 голосов
/ 09 ноября 2010

Ааа плагин проверки, всегда так сложно: (

Сначала я добавил атрибуты id во все поля ввода. Затем я сделал для вас функцию изменения:

$("input[name='userAction']").change(function() {
    $('#signupFields').toggle();
    $('#loginFields').toggle();    
    if ($("input[name='userAction']:checked").val() === "login") {
        removeRules(signupRules);
        addRules(loginRules);
    } else {        
        removeRules(loginRules);
        addRules(signupRules);

    }
});

Функции добавления и удаления выглядят следующим образом:

function addRules(rulesObj){
    for (var item in rulesObj){
       $('#'+item).rules('add',rulesObj[item]);  
    } 
}

function removeRules(rulesObj){
    for (var item in rulesObj){
       $('#'+item).rules('remove');  
    } 
}

Вот и все. Смотрите здесь для рабочего примера: http://jsfiddle.net/ryleyb/wHpus/66/

РЕДАКТИРОВАТЬ : Для меня неинтуитивная часть в том, что я не вижу простого способа добавить / удалить правила для всей формы после того, как вы позвоните validate вместо этого вы должны манипулировать отдельными элементами формы.

34 голосов
/ 29 ноября 2012

Или вы можете использовать свойство .

http://jqueryvalidation.org/category/plugin/ поиск зависит

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

$(".selector").validate({
  rules: {
    contact: {
      required: true,
      email: {
        depends: function(element) {
          return $("#contactform_email:checked")
        }
      }
    }
  }
});
8 голосов
/ 12 декабря 2012

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

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

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

7 голосов
/ 17 мая 2016

Это сообщение написано много лет назад, но, поскольку оно было просмотрено много раз, я думаю, что было бы полезно сказать, что плагин проверки jQuery теперь позволяет нам читать, добавлять и удалять правила.

Некоторые примеры:

  1. Распечатать все правила, прикрепленные к #myField: console.log($('#myField').rules());

  2. Удалить ненужное правило: $('#myField').rules('remove', 'min');

  3. Добавить новое правило: $('myField').rules('add', {min: 10});

Так, например, если вы хотите динамически обновить минимальное требуемое значение.Вы можете позвонить remove и add сразу после:

// Something happened. The minimum value should now be 100
$('#myField').rules('remove', 'min');
$('#myField').rules('add', {min: 100});

Более подробную информацию можно найти здесь: https://jqueryvalidation.org/category/plugin/#-rules()

3 голосов
/ 22 марта 2014

попробуйте это ..

rules: {
    address: {
       required: {
                   depends: function(element) {
                     if (....){
                       return true;}
                     else{
                       return false;}
                   }
                 }
             }
       }

кредит от здесь .

3 голосов
/ 24 января 2012

Теперь есть возможность игнорировать поля полей по критериям селектора, таким как невидимый или отключенный, так что вам не придется менять набор правил:

.validate({
  ignore: ":not(:visible),:disabled",
  ...
1 голос
/ 18 июля 2014

Отслеживайте объект проверки и напрямую удаляйте / заменяйте правила.У меня работает с v1.13.0

var validation = $('#form1').validate(); //Keep track of validation object

//Rule set 1
var validationRulesLogin = {
    headerEmail: {
        required: true,
        email: true
    },
    headerPassword: "required"
};
var validationMessagesLogin = {
    headerEmail: {
        required: "Please enter your email address.",
        email: "Not a valid email address."
    },
    headerPassword: "Please enter your password."
};

//Rule set 2
var validationRulesSignup = {
    signupEmail: {
        required: true,
        email: true
    },
    signupPassword: "required",
    signupPassword2: {
        equalTo: "#phBody_txtNewPassword"
    }
};
var validationMessagesSignup = {
    signupEmail: {
        required: "Please enter your email address.",
        email: "Not a valid email address."
    },
    signupPassword: "Please enter your password.",
    signupPassword2: "Passwords are not the same."
};

//Toggle rule sets
function validatingLoginForm(){
    validation.resetForm();
    validation.settings.rules = validationRulesLogin;
    validation.settings.messages = validationMessagesLogin;
}
function validationSignupForm(){
    validation.resetForm();
    validation.settings.rules = validationRulesSignup;
    validation.settings.messages = validationMessagesSignup;
}
0 голосов
/ 08 ноября 2017

У меня была похожая проблема, и я решил ее, добавив класс requiredForLogin ко всем текстовым полям входа в систему и класс requiredForSignUp ко всем текстовым полям регистрации.

Затем использовал jQuery toggleClass и jQuery.validate's addClassRules для включения и выключения правил в зависимости от того, какая кнопка была нажата.

function EnableAllValidation() {
    // remove the jquery validate error class from anything currently in error
    //  feels hackish, might be a better way to do this
    $(".error").not("label").removeClass("error");

    // remove any the 'disabled' validation classes, 
    //  and turn on all required validation classes 
    //  (so we can subsequently remove the ones not needed)
    $(".requiredForLoginDisabled").toggleClass("requiredForLoginDisabled requiredForLogin");
    $(".requiredForSignUpDisabled").toggleClass("requiredForSignUpDisabled requiredForSignUp");
}
function EnableLoginValidation() {
    // reenable all validations
    //  then disable the signUp validations
    EnableAllValidation();
    $(".requiredForSignUp").toggleClass("requiredForSignUpDisabled requiredForSignUp");
}
function EnableSignUpValidation() {
    // reenable all validations
    //  then disable the login validations
    EnableAllValidation();
    $(".requiredForLogin").toggleClass("requiredForLoginDisabled requiredForLogin");
}
$(document).ready(function () {
    $("input[value='login']").click(function () {
        EnableLoginValidation();
    });
    $("input[value='signup']").click(function () {
        EnableSignUpValidation();
    });

    $("#myForm").validate();
    jQuery.validator.addClassRules({
        requiredForSignUp: {
            required: true
        },
        requiredForLogin: {
            required: true
        }
    });

});
0 голосов
/ 20 октября 2014

приведенный ниже код работает превосходно ...

.validate({
  ignore: ":not(:visible),:disabled",
  ...
0 голосов
/ 12 декабря 2013

Взгляните на мой ответ https://stackoverflow.com/a/20547836/1399001. Включает работающий jsfiddle.В вашем примере будет что-то вроде этого:

$("input[name='userAction']").change(function() {

    var settings = $("#myForm").validate().settings;

      if ($("input[name='userAction']:checked" ).val() === "login") {
            $.extend(settings, {
              rules: loginRules
            });
    } else {
            $.extend(settings, {
              rules: signupRules
            });
    }


    $("#myForm").valid();

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