Tôi đang sử dụng Plugin jQuery Validate tuyệt vời để xác thực một số biểu mẫu. Trên một biểu mẫu, tôi cần đảm bảo rằng người dùng điền vào ít nhất một trong một nhóm trường. Tôi nghĩ rằng tôi đã có một giải pháp khá hay và muốn chia sẻ nó. Vui lòng đề xuất bất kỳ cải tiến nào bạn có thể nghĩ đến.
Không tìm thấy cách tích hợp nào để thực hiện việc này, tôi đã tìm kiếm và tìm thấy phương pháp xác thực tùy chỉnh của Rebecca Murphey , rất hữu ích.
Tôi đã cải thiện điều này theo ba cách:
- Để cho phép bạn chuyển vào một bộ chọn cho nhóm trường
- Để cho phép bạn chỉ định số lượng nhóm đó phải được điền để xác thực vượt qua
- Để hiển thị tất cả đầu vào trong nhóm khi vượt qua xác thực ngay sau khi một trong số chúng vượt qua xác thực. (Xem lời cảm ơn Nick Craver ở cuối.)
Vì vậy, bạn có thể nói "ít nhất X đầu vào phù hợp với bộ chọn Y phải được điền."
Kết quả cuối cùng, với đánh dấu như thế này:
<input class="productinfo" name="partnumber">
<input class="productinfo" name="description">
... là một nhóm các quy tắc như sau:
// Both these inputs input will validate if
// at least 1 input with class 'productinfo' is filled
partnumber: {
require_from_group: [1,".productinfo"]
}
description: {
require_from_group: [1,".productinfo"]
}
Mục số 3 giả định rằng bạn đang thêm một lớp .checked
thông báo lỗi của mình khi xác thực thành công. Bạn có thể làm điều này như sau, như được minh họa ở đây .
success: function(label) {
label.html(" ").addClass("checked");
}
Như trong bản trình diễn được liên kết ở trên, tôi sử dụng CSS để cung cấp cho mỗi span.error
hình ảnh X làm nền của nó, trừ khi nó có lớp .checked
, trong trường hợp đó, nó sẽ nhận được hình ảnh dấu kiểm.
Đây là mã của tôi cho đến nay:
jQuery.validator.addMethod("require_from_group", function(value, element, options) {
var numberRequired = options[0];
var selector = options[1];
//Look for our selector within the parent form
var validOrNot = $(selector, element.form).filter(function() {
// Each field is kept if it has a value
return $(this).val();
// Set to true if there are enough, else to false
}).length >= numberRequired;
// The elegent part - this element needs to check the others that match the
// selector, but we don't want to set off a feedback loop where each element
// has to check each other element. It would be like:
// Element 1: "I might be valid if you're valid. Are you?"
// Element 2: "Let's see. I might be valid if YOU'RE valid. Are you?"
// Element 1: "Let's see. I might be valid if YOU'RE valid. Are you?"
// ...etc, until we get a "too much recursion" error.
//
// So instead we
// 1) Flag all matching elements as 'currently being validated'
// using jQuery's .data()
// 2) Re-run validation on each of them. Since the others are now
// flagged as being in the process, they will skip this section,
// and therefore won't turn around and validate everything else
// 3) Once that's done, we remove the 'currently being validated' flag
// from all the elements
if(!$(element).data('being_validated')) {
var fields = $(selector, element.form);
fields.data('being_validated', true);
// .valid() means "validate using all applicable rules" (which
// includes this one)
fields.valid();
fields.data('being_validated', false);
}
return validOrNot;
// {0} below is the 0th item in the options field
}, jQuery.format("Please fill out at least {0} of these fields."));
Hoan hô!
La lên
Bây giờ cho lời cảm ơn đó - ban đầu, mã của tôi chỉ ẩn thông báo lỗi một cách mù quáng trên các trường khớp khác thay vì xác thực lại chúng, có nghĩa là nếu có vấn đề khác (như 'chỉ cho phép số và bạn đã nhập chữ cái') , nó bị ẩn cho đến khi người dùng cố gắng gửi. Điều này là do tôi không biết cách tránh vòng lặp phản hồi được đề cập trong các nhận xét ở trên. Tôi biết phải có một cách, vì vậy tôi đã hỏi một câu hỏi , và Nick Craver đã khai sáng cho tôi. Cảm ơn, Nick!
Câu hỏi đã được giải quyết
Đây ban đầu là một loại câu hỏi "hãy để tôi chia sẻ điều này và xem liệu ai có thể đề xuất cải tiến". Mặc dù tôi vẫn hoan nghênh phản hồi nhưng tôi nghĩ rằng nó đã khá hoàn chỉnh vào thời điểm này. (Nó có thể ngắn hơn, nhưng tôi muốn nó dễ đọc và không nhất thiết phải súc tích.) Vì vậy, hãy cứ tận hưởng!
Cập nhật - hiện là một phần của Xác thực jQuery
Điều này chính thức được thêm vào jQuery Validation vào ngày 4/3/2012.