2011-11-15 20 views
43

Tôi đang sử dụng jQuery Validation Plugin trên biểu mẫu của mình. Trên mẫu của tôi, tôi có trường 'Điện thoại' và 'Số điện thoại di động' cánh đồng.Xác thực jQuery - Hai trường, chỉ yêu cầu điền vào một

Làm cách nào để tôi thực hiện nó để người dùng phải điền vào một trong số đó, nhưng có thể là trường?

+0

Tôi nghĩ rằng bạn sẽ phải tìm một cách để loại bỏ một quy tắc sau một được điền vào, và ngược lại nếu họ loại bỏ các giá trị, và gõ vào trường thứ hai. Điều đó sẽ tự động tạo tập lệnh xác thực của bạn. Có vẻ như một giải pháp đơn giản như thế này sẽ làm việc với jQuery đơn giản và không phải là thư viện xác nhận. –

+1

bản sao có thể có của [Xác thực jQuery - yêu cầu ít nhất một trường trong một nhóm sẽ được điền] (http://stackoverflow.com/questions/1300994/jquery-validate-require-at-least-one-field-in-a -group-to-be-filled) – saluce

Trả lời

52

này trông giống như những gì bạn cần phải sử dụng dependency-callback

Điều này sẽ cho phép bạn làm là:

Làm cho các yếu tố cần thiết, tùy thuộc vào kết quả của các cuộc gọi lại nhất định.

Sau đó, bạn có thể đặt quy tắc xác thực required trên hai trường điện thoại sẽ chỉ được yêu cầu dựa trên sự trở lại từ hàm gọi lại; do đó bạn có thể đặt quy tắc trên trường điện thoại để nói yêu cầu quy tắc này chỉ khi trường di động trống và ngược lại cho trường di động.

này chưa được kiểm chứng nhưng về mặt lý thuyết

rules: { 
    telephone: { 
     required: function(element) { 
      return $("#mobile").is(':empty'); 
     } 
    }, 
    mobile: { 
     required: function(element) { 
      return $("#telephone").is(':empty'); 
     } 
    } 
} 

Hãy chắc chắn để kiểm tra ý kiến ​​/ câu trả lời khác cho câu trả lời cập nhật càng tốt.

+13

Có (bây giờ) một cách đơn giản hơn để làm điều này: 'bắt buộc:" #mobile: empty "' – saluce

+2

Tôi có một yêu cầu tương tự ngoại trừ việc tôi chỉ cần một thông báo chung để hiển thị tại đầu (hoặc cuối) của biểu mẫu trái ngược với thông báo lỗi bên cạnh mỗi trường trong biểu mẫu. Trong ví dụ được trích dẫn, nếu cả hai trường trống, tôi sẽ thấy thông báo lỗi tương tự bên cạnh mỗi trường thừa. Ít nhất cho tình hình của tôi, tôi cần một cái gì đó như "Ít nhất một lĩnh vực phải được lấp đầy." ở đầu biểu mẫu. –

+3

Có vấn đề với việc sử dụng điều này trên các phần tử văn bản. ': empty' sẽ đúng cho một vùng văn bản. Nói chung, ': empty' là xấu để sử dụng để xác nhận, bạn nên tìm kiếm các lựa chọn thay thế. – Milimetric

24

Đến đây để tìm câu trả lời tương tự. Tìm thấy bài viết trên rất hữu ích. Cảm ơn.

Tôi đã mở rộng giải pháp này để kiểm tra xem trường khác có hợp lệ không, thay vì chỉ "không trống". Điều này đảm bảo rằng người dùng nhập Số điện thoại hợp lệ trước khi xóa lớp "bắt buộc" khỏi trường Di động và ngược lại.

Mobile: { 
    required: function(element) { 
    return (!$("#Phone").hasClass('valid')); 
    } 
}, 
Phone: { 
    required: function(element) { 
     return (!$("#Mobile").hasClass('valid')); 
    } 
} 
+0

Đây là câu trả lời hay nhất, IMO. Những người khác không làm việc cho tôi. –

+0

Yep đây phải là câu trả lời đúng – Magnum

35

Tôi nghĩ rằng cách chính xác để làm điều này là sử dụng phương pháp "require_from_group".

Bạn có thể CheckIt trên http://jqueryvalidation.org/require_from_group-method/

Các ví dụ là chính xác những gì bạn đang tìm kiếm:

<input class="left phone-group" id="mobile_phone" name="mobile_phone"> 
<input class="left phone-group" id="home_phone" name="home_phone"> 
<input class="left phone-group" id="work_phone" name="work_phone"> 

<script> 
$("#form").validate({ 
    rules: { 
    mobile_phone: { 
     require_from_group: [1, ".phone-group"] 
    }, 
    home_phone: { 
     require_from_group: [1, ".phone-group"] 
    }, 
    work_phone: { 
     require_from_group: [1, ".phone-group"] 
    } 
    } 
}); 
</script> 

Đó là bắt buộc để bao gồm thêm-methods.js

+2

Phương pháp này hoạt động tốt hơn. Thông báo rõ ràng hơn và các lỗi được dọn sạch ngay sau khi bạn nhập vào bên trong một trường được nhóm. Lưu ý rằng bạn cần phải bao gồm các phương thức bổ sung.js – jalogar

+4

Đây phải là câu trả lời được chấp nhận! Nó là một phần của api và dễ sử dụng nhất. –

+3

Đã bỏ phiếu là câu trả lời được chấp nhận vì đây là câu trả lời hữu ích nhất và sử dụng tính năng được tích hợp sẵn của plugin thay vì giải pháp bánh xe được tái phát minh. –

1

Yêu cầu là Validation cần phải là một trong hai C hoặc (A và B) là bắt buộc. Điều làm việc đối với tôi là:

$.validator.addMethod("multipeFieldValidator", function(value) { 
    var returnVal = false; 
    if($("#Cfield").val() != '' || ($("#Afield").val() != '' && $("#Bfield").val() != '')) { 
     returnVal = true; 
    } 
    return returnVal; 
}, 'Either C or A and B is required'); 


$('#Afield.form-control').change(function(){ 
    $(this).valid(); 
    $("#Bfield").valid(); 
    $("#Cfield").valid(); 

}); 

$('#Bfield.form-control').change(function(){ 
    $(this).valid(); 
    $("#Afield").valid(); 
    $("#Cfield").valid(); 
}); 

$('#Cfield.form-control').change(function(){ 
    $(this).valid(); 
    $("#Bfield").valid(); 
    $("#Afield").valid(); 
}); 


within rules I have 
Afield: "multipeFieldValidator", 
Bfield: "multipeFieldValidator", 
Cfield: "multipeFieldValidator" 
0

tôi đã gặp rắc rối là .is(':empty') vì vậy đây là tùy chọn làm việc của tôi chẳng hạn.

Trước:

rules: { 
    name:  {required: true}, 
    email:  {required: true}, 
    phone:  {required: true} 
} 

Tất cả các lĩnh vực yêu cầu.Nhưng tôi muốn email và/hoặc điện thoại như vậy để tạo ra các 'hoặc':

rules: { 
    name:  {required: true}, 
    email:  {required: 
        function() { 
         //returns true if phone is empty 
         return !$("#phone").val(); 
        } 
       }, 
    phone:  {required: 
        function() { 
         //returns true if email is empty 
         return !$("#email").val(); 
        } 
       } 
}, 
messages: { 
    email: "Email is required if no phone number is given.", 
    phone: "A phone number is required if no phone email is given." 
} 

Và bạn sẽ thấy rằng tôi đã thêm các tùy chọn messages để cung cấp cho người dùng một số thông tin có ý nghĩa bởi vì các thông điệp mặc định sẽ nói rằng mỗi trường là bắt buộc mà không đúng trong tình huống này.

0

$(document).ready(function() { 
 
    jQuery.validator.addMethod("mobile10d", function (value, element) { 
 
     return this.optional(element) || /^[7-9]{1}[0-9]{9}$/.test(value); 
 
    }, "Please enter a valid 10 digit phone number."); 
 
    $("#form_id").validate({ 
 
     rules: { 
 
      mobile: { 
 
       required: "#telephone:blank", 
 
       mobile10d: true 
 
      }, 
 
      telephone: { 
 
       required: "#mobile:blank", 
 
       mobile10d: true 
 
      } 
 
     } 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"></script> 
 
<form class="" action="" method="POST" id="form_id"> 
 
    <div class="col-md-4 form-group"> 
 
     <label class="form-control">Mobile<span class="required">*</span></label> 
 
     <input class="form-control" type="text" name="mobile" id="mobile" placeholder="0-9"> 
 
    </div> 
 
    <div class="col-md-4 form-group"> 
 
     <label class="form-control">Telephone<span class="required">*</span></label> 
 
     <input class="form-control" type="text" name="telephone" id="telephone" placeholder="0-9"> 
 
    </div> 
 
    <div class="form-group"> 
 
     <input type="submit" name="" value="Submit" class="apply-now-btn"> 
 
    </div> 
 
</form>

+0

Một số giải thích có thể hữu ích :) – spijs

Các vấn đề liên quan