Xác thực jQuery - Kích hoạt xác thực cho các trường ẩn


186

Trong phiên bản mới của plugin xác thực jQuery 1.9 theo mặc định xác thực các trường ẩn bị bỏ qua . Tôi đang sử dụng CKEditor cho trường nhập liệu textarea và nó ẩn trường đó và thay thế nó bằng iframe. Trường ở đó, nhưng xác nhận bị vô hiệu hóa cho các trường ẩn. Với phiên bản plugin xác thực 1.8.1, mọi thứ hoạt động như mong đợi.

Vì vậy, câu hỏi của tôi là làm thế nào để kích hoạt xác thực cho các trường ẩn với plugin xác thực v1.9.

Cài đặt này không hoạt động:

$.validator.setDefaults({ ignore: '' });


Liên kết "xác thực các trường ẩn bị bỏ qua" đã chết.
Beepye

Xác nhận làm việc theo mặc định cho tôi với <input type="text" name="myfield" id="myfield" required="required" style="display: none;">. Tôi đã không phải thay đổi bất kỳ cài đặt hoặc làm bất cứ điều gì đặc biệt.
squarecandy

Câu trả lời:


328

Tác giả của plugin nói rằng bạn nên sử dụng "dấu ngoặc vuông không có dấu ngoặc kép" ,[]

http://bassistance.de/2011/10/07/release-validation-plugin-1-9-0/

Phát hành: Plugin xác thực 1.9.0: "... Một thay đổi khác sẽ giúp việc thiết lập các biểu mẫu với các yếu tố ẩn dễ dàng hơn, hiện tại chúng bị bỏ qua theo mặc định (tùy chọn Bỏ qua bỏ qua có tên: ẩn bây giờ là mặc định). có thể phá vỡ một thiết lập hiện có. Trong trường hợp không thực sự xảy ra, bạn có thể sửa nó bằng cách đặt tùy chọn bỏ qua thành [[] (dấu ngoặc vuông không có dấu ngoặc kép). "

Để thay đổi cài đặt này cho tất cả các hình thức:

$.validator.setDefaults({ 
    ignore: [],
    // any other default options and/or rules
});

(Không bắt buộc .setDefaults()phải nằm trong document.readyhàm)

HOẶC cho một hình thức cụ thể:

$(document).ready(function() {

    $('#myform').validate({
        ignore: [],
        // any other options and/or rules
    });

});

CHỈNH SỬA :

Xem câu trả lời này để biết cách bật xác thực trên một số trường ẩn nhưng vẫn bỏ qua các trường khác.


EDIT 2 :

Trước khi để lại nhận xét rằng "điều này không hoạt động" , hãy nhớ rằng OP chỉ đơn giản là hỏi về plugin Xác thực jQuery và câu hỏi của anh ấy không liên quan gì đến việc ASP.NET, MVC hoặc bất kỳ khung Microsoft nào khác có thể thay đổi bình thường của plugin này hành vi dự kiến. Nếu bạn đang sử dụng khung Microsoft, chức năng mặc định của plugin Xác thực jQuery bị ghi đè bởi Microsoftunobtrusive-validation plugin .

Nếu bạn đang vật lộn với unobtrusive-validationplugin, thì vui lòng tham khảo câu trả lời này thay vào đó: https://stackoverflow.com/a/11053251/594235


26
Có lẽ các cử tri xuống có thể cho tôi một số phản hồi mang tính xây dựng. Mặt khác, câu trả lời là hoàn toàn khép kín, có nguồn gốc chính xác, đưa ra các ví dụ mã và đúng về mặt kỹ thuật theo tác giả của plugin.
Sparky

1
@StijnVanBael, không, đó là sai. Xem: jsfiddle.net/F4w92/1 và cũng xem nhận xét thứ hai của tôi về câu trả lời của jerick .
Sparky

4
Nói tốt @Sparky. Số phiếu giảm có lẽ là kiểu trả thù, tôi đã gặp phải điều tương tự ..
Omar

1
JSFiddle không hoạt động nữa vì các thư viện được tải bằng HTTP thay vì HTTPS. Phiên bản cập nhật: jsfiddle.net/F4w92/31
hotips

1
Tôi cũng đánh giá thấp vì điều này không hoạt động đối với tôi khi sử dụng phiên bản mới nhất, phải sử dụng: $ ("biểu mẫu"). Data ("trình xác nhận"). Settings.ignore = ""; như câu trả lời khác từ @James dưới đây
Mark Homer

71

Điều này làm việc cho tôi, trong một trang web ASP.NET MVC3 nơi tôi đã rời khỏi khung để thiết lập xác thực không phô trương, v.v., trong trường hợp nó hữu ích với bất kỳ ai:

$("form").data("validator").settings.ignore = "";

2
Tôi cũng thích cái này vì nó có nghĩa là tôi có thể làm điều đó trong một số trường hợp nhất định, thay vì thay đổi hành vi mặc định.
Steve Owen

5
Tôi đã phải làm theo cách này, vì sử dụng .validate () để thay đổi các tùy chọn không hoạt động.
Farinha

1
Đây là giải pháp chính xác cho xác nhận không phô trương, tôi đã thử tất cả các giải pháp khác, chúng có thể hoạt động trong trường hợp KHÔNG sử dụng không phô trương. Nếu bạn đang sử dụng không phô trương ở đây là đúng nơi.
Hakan Fıstık

Phải sử dụng phương pháp này để xác thực không phô trương để hoạt động với Bootstrap Accordion
bsod_

Khi tôi thay đổi nó thành hình thức này không được xác nhận. Tôi sử dụng lõi .net không phô trương
Offir Pe'er

64

Hãy chắc chắn để đặt

 $.validator.setDefaults({ ignore: '' });

KHÔNG bên trong$(document).ready


2
Câu trả lời tuyệt vời. Một liên kết đến tài liệu là tốt cho mọi người để tìm hiểu, nhưng một câu trả lời thẳng là imo có giá trị hơn. Anh ấy đã đi đúng hướng, nhưng đặt nó bên ngoài $ (tài liệu). Đã là mẹo.
Kevin Zych

3
@KevinZych, Rõ ràng, nó hoàn toàn không có sự khác biệt dù $.validator.setDefaults()được đặt bên trong hay bên ngoài bộ xử lý sẵn sàng DOM. Hãy so sánh jsFiddle này để jsFiddle này .
Sparky

Thú vị @Sparky, câu đố của bạn là bằng chứng tuyệt vời. Tôi phải quay lại và xem mã tôi đã sửa bằng giải pháp này và tìm hiểu lý do tại sao tôi đi đến kết luận rằng nó phải nằm trong trình xử lý sẵn sàng của DOM. Phải có một số lý do khác.
Kevin Zych

Justin giải thích tại sao chạy bên trong doc sẵn sàng gây ra vấn đề. Tuy nhiên, câu trả lời này không phải là một lựa chọn tốt vì thật khó để đảm bảo rằng một cái gì đó bên ngoài tài liệu đã sẵn sàng sẽ chạy TRƯỚC tài liệu sẵn sàng. Doc. Đã không chờ các tập lệnh bên ngoài nó chạy. Không có gì cá nhân, nhưng đây không phải là một câu trả lời đáng tin cậy.
AaronLS

Cuối cùng tôi cũng có câu trả
lời..Cảm ơn

29

Vì vậy, tôi sẽ đi sâu hơn một chút về lý do tại sao điều này không hoạt động bởi vì tôi là kiểu người không thể ngủ vào ban đêm mà không biết haha. Tôi đang sử dụng jQuery xác thực 1.10 và Xác thực không giới hạn Microsoft jQuery 2.0.20710.0 được xuất bản vào ngày 1/29/2013.

Tôi đã bắt đầu bằng cách tìm kiếm phương thức setDefaults trong Xác thực jQuery và tìm thấy nó trên dòng 261 của tệp chưa được tối ưu hóa. Tất cả chức năng này thực sự là hợp nhất các cài đặt json của bạn vào hiện $.validator.defaultscó được khởi tạo với thuộc tính bỏ qua được đặt thành ": hidden" cùng với các mặc định khác được xác định trong Xác thực jQuery. Vì vậy, tại thời điểm này, chúng tôi đã ghi đè bỏ qua. Bây giờ hãy xem tài sản mặc định này đang được tham chiếu tại.

Khi tôi truy tìm mã để xem nơi $.validator.defaultsđang được tham chiếu. Tôi nhận thấy rằng chỉ được sử dụng bởi hàm tạo cho trình xác thực mẫu, dòng 170 trong jQuery xác thực tệp chưa được xác thực.

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

Tại thời điểm này, trình xác nhận sẽ hợp nhất mọi cài đặt mặc định đã được đặt và đính kèm với trình xác thực mẫu. Khi bạn nhìn vào mã đang thực hiện xác nhận, tô sáng, làm nổi bật, v.v ... tất cả đều sử dụng đối tượng validator.sinstall để kéo thuộc tính bỏ qua. Vì vậy, chúng ta cần đảm bảo rằng nếu chúng ta thiết lập bỏ qua với phương thức setDefaults thì nó phải xảy ra trước khi $ ("biểu mẫu"). Validate () được gọi.

Nếu bạn đang sử dụng Asp.net MVC và plugin không phô trương, thì bạn sẽ nhận ra sau khi xem javascript mà xác thực được gọi trong document. Yet. Tôi cũng đã gọi setDefaults của mình trong tài liệu. Khối đã được thực thi sau tập lệnh, jquery xác thực và không phô trương vì tôi đã xác định các tập lệnh đó trong html trước khi có lệnh gọi trong đó. Vì vậy, cuộc gọi của tôi rõ ràng không có tác động đến chức năng mặc định bỏ qua các yếu tố ẩn trong quá trình xác nhận. Có một vài lựa chọn ở đây.

Tùy chọn 1 - Bạn có thể như Juan Mellado đã chỉ ra có cuộc gọi bên ngoài tài liệu. Đã thực hiện ngay khi tập lệnh được tải. Tôi không chắc chắn về thời gian của việc này vì các trình duyệt hiện có khả năng tải tập lệnh song song. Nếu tôi quá thận trọng thì xin hãy sửa cho tôi. Ngoài ra, có lẽ có những cách xoay quanh vấn đề này nhưng vì nhu cầu của tôi, tôi đã không đi theo con đường này.

Lựa chọn 2a - Đặt cược an toàn trong mắt tôi là chỉ cần thay thế $.validator.setDefaults({ ignore: '' });bên trong tài liệu $("form").data("validator").settings.ignore = "";. Đã có sự kiện . Điều này sẽ sửa đổi thuộc tính bỏ qua được xác thực bởi jQuery xác thực khi thực hiện mỗi xác thực trên các thành phần của bạn cho biểu mẫu đã cho.

Tùy chọn 2b - Sau khi xem mã nhiều hơn một chút, bạn cũng có thể sử dụng $("form").validate().settings.ignore = "";làm cách đặt thuộc tính bỏ qua. Lý do là khi nhìn vào hàm xác thực, nó sẽ kiểm tra xem một đối tượng trình xác nhận đã được lưu trữ cho phần tử biểu mẫu thông qua $.data()hàm chưa. Nếu nó tìm thấy một đối tượng trình xác nhận được lưu trữ với phần tử biểu mẫu thì nó chỉ trả về đối tượng trình xác nhận thay vì tạo một đối tượng khác.


Cảm ơn bạn đã trả lời chi tiết!
davidallyoung

Làm tốt vì câu trả lời của OP không hiệu quả với tôi trong MVC 5
Mark Homer

phân tích của bạn đã giúp tôi rất nhiều trong việc khắc phục một vấn đề xác nhận của tôi. +1
pgcan

15

Điều này làm việc cho tôi trong một trang web ASP.NET. Để kích hoạt xác thực trên một số trường ẩn, hãy sử dụng mã này

$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";

Để kích hoạt xác thực cho tất cả các yếu tố của biểu mẫu, hãy sử dụng phần tử này $("form").data("validator").settings.ignore = "";

Lưu ý rằng sử dụng chúng trong $(document).ready(function() { })


8

Chỉ cần thêm ignore: []vào trang cụ thể cho mẫu cụ thể, giải pháp này đã làm việc cho tôi.

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });

1

Đây là làm việc cho tôi.

jQuery("#form_name").validate().settings.ignore = "";

0

Việc xác thực đã làm việc cho tôi khi gửi biểu mẫu, nhưng nó không thực hiện xác nhận theo hướng sự kiện phản ứng trên đầu vào danh sách được chọn.

Để khắc phục điều này, tôi đã thêm vào như sau để kích hoạt thủ công xác thực sự kiện jquery được thư viện thêm vào:

$(".chosen-select").each(function() {
  $(this).chosen().on("change", function() {
    $(this).parents(".form-group").find("select.form-control").trigger("focusout.validate");
  });
});

jquery.validate bây giờ sẽ thêm .validlớp vào danh sách chọn bên dưới.

Hãy cẩn thận: Điều này không yêu cầu một mẫu html nhất quán cho đầu vào biểu mẫu của bạn. Trong trường hợp của tôi, mỗi đầu vào nộp được gói trong một div.form-groupvà mỗi đầu vào có .form-control.


-15

Chỉ cần tìm văn bản bỏ qua: ": hidden" trong tệp xác thực jquery của bạn và nhận xét nó. Sau khi nhận xét, nó sẽ không bao giờ mất bất kỳ yếu tố ẩn nào để xác thực ...

Cảm ơn


5
Không bao giờ là một ý tưởng tốt để chỉ bình luận ngẫu nhiên ra mã trong thư viện bên thứ ba.
Jacques
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.