2010-11-08 43 views
40

Tôi có một hình thức duy nhất, tùy thuộc vào nút radio được nhấp (Đăng nhập hoặc đăng ký), hiển thị một trong hai:jQuery Validation: Quy định Thay đổi động

  • địa chỉ email
  • mật khẩu

hoặc:

  • tên
  • tuổi
  • địa chỉ email
  • mật khẩu

Nhấp vào nút radio Toggles khả năng hiển thị của các trường Đăng nhập/đăng ký:

<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> 

Tôi đang sử dụng jQuery Validation plug-in, và tôi muốn sử dụng các quy tắc sau:

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

Làm cách nào để thêm quy tắc xác thực chính xác dựa trên động :

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

Tôi đã thử những điều sau đây:

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

Nhưng kể từ khi lĩnh vực nhập của tôi là mặc định hiển thị, kiểm chứng thực của nó làm việc, nhưng kịch bản đăng ký không; nó muốn xác thực các trường Đăng nhập vì một lý do nào đó. Tui bỏ lỡ điều gì vậy?

+0

bạn có đang thay thế các phần tử trong một biểu mẫu hoặc bạn đang hiển thị các phần tử ẩn trong biểu mẫu không? Tôi sẽ thiết lập xác nhận cho hai biểu mẫu riêng biệt và sau đó chuyển đổi chế độ hiển thị của hai biểu mẫu tùy thuộc vào tùy chọn nào được chọn. – zzzzBov

+0

Đây là một hình thức duy nhất có thể hiển thị các trường Đăng nhập/Đăng ký bằng nút radio. – Bullines

+0

phương thức xác thực chỉ có thể được gọi một lần cho mỗi biểu mẫu. Hãy suy nghĩ về nó như là một khởi tạo. Hãy xem [bài đăng này] (http://suntouchersoftware.com/2013/07/05/tips-for-using-the-jquery-validation-plugin/) để biết chi tiết. – lboullo0

Trả lời

52

Ahh xác nhận plugin, luôn luôn như vậy khó khăn :(

Đầu tiên, tôi đã thêm thuộc tính id cho tất cả các hộp đầu vào Sau đó, tôi đã thực hiện một chức năng thay đổi dành cho bạn:.

$("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); 

    } 
}); 

Các add và remove chức năng giống như thế này:.

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

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

đó là khá nhiều nó Xem ở đây cho một ví dụ làm việc: http://jsfiddle.net/ryleyb/wHpus/66/

EDIT: Đối với tôi, phần không trực quan là tôi không thấy một cách dễ dàng để thêm/xóa quy tắc cho toàn dạng sau khi bạn gọi validate, thay vào đó bạn phải thao tác các yếu tố hình thức cá nhân .

+0

Tôi thấy lỗi "$ .data (element.form, 'validator') là không xác định". – Bullines

+0

trên jsfiddle của tôi, hoặc khi bạn sử dụng nó trong mã của bạn? Nếu đó là của bạn, bạn có thêm thẻ id vào tất cả các phần tử biểu mẫu của mình không? – Ryley

+2

Tôi thấy lỗi trong mã của mình. Nó chỉ ra rằng tôi đã không thêm validate() trước khi áp dụng các quy tắc. Điều đó làm cho tất cả sự khác biệt :) Cảm ơn. – Bullines

3

Có một tùy chọn hiện nay để bỏ qua lĩnh vực căn cứ trên các tiêu chí chọn, chẳng hạn như vô hình hay vô hiệu hóa, như vậy bạn sẽ không cần phải thay đổi thiết lập quy tắc của bạn:

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

Không có cách nào thiết thực để áp dụng đề xuất của bạn cho kịch bản của OP. (Ngoài ra còn có các phương pháp tích hợp để thay đổi các quy tắc.) – Sparky

+0

Đây là một gợi ý tuyệt vời nếu bạn đang cố gắng tự động bật hoặc tắt tính năng xác thực của phần tử, nhưng như đã nêu ở trên, không áp dụng cho các quy tắc. – Ken

28

Hoặc bạn có thể sử dụng phụ thuộc tài sản.

http://jqueryvalidation.org/category/plugin/ tìm kiếm phụ thuộc

Ví dụ: Chỉ định một yếu tố tiếp xúc theo yêu cầu và như địa chỉ email, sau này tùy thuộc vào một hộp kiểm được kiểm tra cho liên hệ qua email.

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

Đây là một ví dụ về cách anh ta có thể sử dụng nó. Thay vì thêm/xóa các quy tắc, tốt hơn hết là làm cho chúng có điều kiện. – robert

+0

Bạn chính xác. Tuy nhiên, đó là một ví dụ không có lời giải thích, và thậm chí không phải là một giải pháp làm việc hoàn chỉnh. 'depends' sẽ chỉ hoạt động trên' rules' có thể được khai báo bằng 'true' hoặc' false' ... không phải bất kỳ cái nào khác. Sẽ tốt hơn trong trường hợp phức tạp hơn của OP để hoán đổi toàn bộ các quy tắc như được thể hiện đầy đủ trong câu trả lời được chấp nhận. – Sparky

+2

Đây chính xác là những gì tôi cần và hoạt động như một sự quyến rũ. Cảm ơn. – Jeremy

7

Nếu bạn muốn gọi xác nhận một lần nữa với các thiết lập mới (quy tắc, các thông điệp ... vv) gọi

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

này sẽ loại bỏ xác nhận cho các hình thức sau đó khởi tạo nó một lần nữa với các mới cài đặt

+0

Có các phương pháp tích hợp để thay đổi các quy tắc động. Không cần phải xóa nó và khởi tạo lại. – Sparky

+0

bạn có thể cho chúng tôi biết phương pháp nào tồn tại để thêm/xóa quy tắc động không? tôi thực sự có thể sử dụng chúng, gây ra tôi đang làm cho các ứng dụng spa và tôi có một đối tượng validator mà tôi giữ làm mới sau khi thay đổi trang. –

+0

Đó là [phương thức 'quy tắc' cùng với' add'] (http://docs.jquery.com/Plugins/Validation/rules). Xem câu trả lời được chấp nhận ở trên để biết cách sử dụng nó. Ngoài ra [duyệt câu trả lời của tôi trên plugin này cho các cách khác] (http://stackoverflow.com/search?q=user:594235%20%5Bjquery-validate%5D). – Sparky

0

Hãy xem câu trả lời của tôi https://stackoverflow.com/a/20547836/1399001. Nó bao gồm một jsfiddle làm việc. Trong ví dụ của bạn sẽ được một cái gì đó như thế này:

$("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(); 

}); 
3

thử này ..

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

tín dụng từ here.

1

Theo dõi đối tượng xác thực và xóa/thay thế quy tắc trực tiếp. Làm việc cho tôi với 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; 
} 
-2

mã dưới đây đang làm việc tuyệt vời ...

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

Đây không phải là câu trả lời hay, vì vậy có lẽ nó sẽ bị bỏ qua, nhưng tôi không thấy cơ sở để xóa nó. Đánh dấu nó là "Có vẻ OK" để trả lời một lá cờ mà người khác đã nêu lên trên đó. – ArtOfWarfare

4

bài này là từ năm trước, nhưng kể từ khi nó đã được xem rất nhiều lần, tôi nghĩ sẽ hữu ích khi nói rằng plugin jQuery Validation giờ đây cho phép chúng ta đọc, thêm và xóa các quy tắc.

Một số ví dụ:

  1. In tất cả các quy tắc gắn liền với #myField: console.log($('#myField').rules());

  2. Hủy bỏ một quy tắc không mong muốn: $('#myField').rules('remove', 'min');

  3. Thêm một quy tắc mới: $('myField').rules('add', {min: 10});

Vì vậy, hãy nói nếu bạn muốn cập nhật động giá trị tối thiểu bắt buộc. Bạn có thể gọi một removeadd ngay sau:

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

Thông tin thêm có thể được tìm thấy ở đây: https://jqueryvalidation.org/category/plugin/#-rules()

+1

Tôi chỉ sử dụng câu trả lời này để giải quyết vấn đề xác thực động của mình. Tôi nghĩ rằng đó có lẽ là cập nhật nhất. –

0

Tôi đã có một vấn đề tương tự và giải quyết nó bằng cách thêm một lớp "requiredForLogin" cho tất cả các đăng nhập hộp văn bản và lớp "requiredForSignUp" cho tất cả các hộp văn bản đăng ký.

Sau đó, sử dụng toggleClass của jQuery và addClassRules của jQuery.validate để bật và tắt các quy tắc tùy thuộc vào nút nào được nhấn.

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

}); 
Các vấn đề liên quan