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

Проверка jQuery: изменение правил динамически

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

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

или

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

Нажатие на переключатель переключает видимость полей Login/Registration:

<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 Validation, и я бы хотел использовать следующие правила:

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 отображаются по умолчанию, его проверки работают, но сценарий регистрации не работает; по какой-то причине он хочет проверить поля Login. Я что-то пропустил?

4b9b3361

Ответ 1

Плагин проверки подлинности Ahh, всегда такой сложный: (

Во-первых, я добавил атрибуты атрибутов во все поля ввода. Затем я сделал для вас функцию изменения:

$("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/

EDIT. Для меня неинтуитивная часть заключается в том, что я не вижу простого способа добавления/удаления правил во всю форму после вызова validate, вместо этого вам нужно манипулировать отдельными элементами формы.

Ответ 2

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

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

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

$(".selector").validate({
  rules: {
    contact: {
      required: true,
      email: {
        depends: function(element) {
          return $("#contactform_email:checked")
        }
      }
    }
  }
});

Ответ 3

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

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

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

Ответ 4

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

.validate({
  ignore: ":not(:visible),:disabled",
  ...

Ответ 5

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

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

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

Ответ 6

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

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

  • Распечатайте все правила, прилагаемые к #myField: console.log($('#myField').rules());

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

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

Итак, скажите, хотите ли вы динамически обновлять минимальное требуемое значение. Вы можете вызвать remove и a 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()

Ответ 7

Следите за объектом проверки и удалите/замените правила напрямую. Работает для меня с 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;
}

Ответ 8

Взгляните на мой ответ fooobar.com/questions/132040/.... Он включает рабочий 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();

});

Ответ 9

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

Затем используется jQuery toggleClass и jQuery.validate 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
        }
    });

});

Ответ 10

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

.validate({
  ignore: ":not(:visible),:disabled",
  ...