jQuery Validate - Włącz sprawdzanie poprawności ukrytych pól

186

W nowej wersji wtyczki sprawdzania poprawności jQuery 1.9 domyślnie ignorowane jest sprawdzanie poprawności ukrytych pól . Korzystam z CKEditor dla pola wejściowego textarea, które ukrywa pole i zastępuje je ramką iframe. Pole jest tam, ale sprawdzanie poprawności wyłączone dla ukrytych pól. W wersji 1.8.1 wtyczki walidacyjnej wszystko działa zgodnie z oczekiwaniami.

Więc moje pytanie brzmi: jak włączyć sprawdzanie poprawności ukrytych pól za pomocą wtyczki sprawdzania poprawności v1.9.

To ustawienie nie działa:

$.validator.setDefaults({ ignore: '' });
Szaman
źródło
1
Zobacz także stackoverflow.com/questions/7952181/…
goodeye,
Link do „ignorowania sprawdzania ukrytych pól” jest martwy.
Beepye
Sprawdzanie poprawności działa dla mnie domyślnie <input type="text" name="myfield" id="myfield" required="required" style="display: none;">. Nie musiałem zmieniać żadnych ustawień ani robić nic specjalnego.
squarecandy

Odpowiedzi:

329

Autor wtyczki mówi, że należy używać „nawiasów kwadratowych bez cudzysłowów” ,[]

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

Wersja: Validation Plugin 1.9.0: „... Kolejna zmiana powinna ułatwić konfigurację formularzy z ukrytymi elementami, są one teraz domyślnie ignorowane (opcja„ ignoruj ​​”ma teraz domyślnie„: ukryty ”). Teoretycznie to może zepsuć istniejącą konfigurację. W mało prawdopodobnym przypadku, gdy tak się dzieje, możesz to naprawić, ustawiając opcję ignorowania na „[]” (nawiasy kwadratowe bez cudzysłowów). ”

Aby zmienić to ustawienie dla wszystkich formularzy:

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

(Nie jest wymagane, aby .setDefaults()było w ramach document.readyfunkcji)

LUB dla jednego konkretnego formularza:

$(document).ready(function() {

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

});

EDYCJA :

Zobacz tę odpowiedź, aby dowiedzieć się, jak włączyć sprawdzanie poprawności w niektórych ukrytych polach, ale nadal ignorować inne.


EDYCJA 2 :

Przed pozostawieniem komentarzy, że „to nie działa” , należy pamiętać, że OP po prostu pyta o wtyczkę jQuery Validate, a jego pytanie nie ma nic wspólnego z tym, jak ASP.NET, MVC lub jakikolwiek inny framework Microsoft może zmienić normalną wtyczkę spodziewane zachowanie. Jeśli używasz środowiska Microsoft, domyślne działanie wtyczki jQuery Validate jest nadpisywane przez unobtrusive-validationwtyczkę Microsoft .

Jeśli masz unobtrusive-validationproblem z wtyczką, zapoznaj się z odpowiedzią: https://stackoverflow.com/a/11053251/594235

iskrzący
źródło
26
Może głosujący na niższy głos może dać mi konstruktywną informację zwrotną. W przeciwnym razie odpowiedź jest całkowicie samodzielna, zawiera odpowiednie źródła, podaje przykłady kodu i jest technicznie poprawna według autora wtyczki.
Sparky,
1
@StijnVanBael, nie, to nieprawda. Zobacz: jsfiddle.net/F4w92/1, a także zobacz mój drugi komentarz do odpowiedzi Jicka .
Sparky,
4
Dobrze powiedziane @Sparky. Oddane głosy to pewna zemsta, spotkałem się z tym samym ...
Omar,
1
JSFiddle już nie działa, ponieważ biblioteki są ładowane w HTTP zamiast HTTPS. Zaktualizowana wersja: jsfiddle.net/F4w92/31
hotips
1
Zanotowałem też, ponieważ nie działa to dla mnie przy użyciu najnowszej wersji, musiałem użyć: $ ("formularz"). Data ("validator"). Settings.ignore = ""; inna odpowiedź od @James poniżej
Mark Homer
73

Działa to dla mnie w witrynie ASP.NET MVC3, w której opuściłem platformę, aby skonfigurować dyskretną weryfikację itp. Na wypadek, gdyby była przydatna dla każdego:

$("form").data("validator").settings.ignore = "";
James Morcom
źródło
2
Podoba mi się również ten, ponieważ oznacza to, że mogę to zrobić w pewnych okolicznościach, zamiast zmieniać domyślne zachowanie.
Steve Owen
5
Musiałem to zrobić w ten sposób, ponieważ użycie opcji .validate () do zmiany opcji nie działało.
Farinha,
1
jest to prawidłowe rozwiązanie dla dyskretnej walidacji, wypróbowałem wszystkie inne rozwiązania, mogłyby one działać w przypadku, gdyby NIE były dyskretne. Jeśli używasz dyskretnych, tutaj jest właściwe miejsce.
Hakan Fıstık
Musiałem użyć tej metody również do dyskretnego sprawdzania poprawności podczas pracy z akordeonem Bootstrap
bsod_
Po zmianie na ten formularz nie jest sprawdzany. Używam dyskretnego rdzenia .net
Offir Pe'er
64

Pamiętaj, aby umieścić

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

NIE w środku$(document).ready

jerick
źródło
2
Doskonała odpowiedź. Link do dokumentacji jest dobry dla ludzi do nauki, ale bezpośrednia odpowiedź jest bardziej cenna imo. OP był na dobrej drodze, ale umieszczenie go poza $ (dokumentem) .ready jest sztuką.
Kevin Zych
3
@KevinZych, Najwyraźniej nie ma absolutnie żadnej różnicy, czy $.validator.setDefaults()jest umieszczony wewnątrz czy na zewnątrz urządzenia do obsługi DOM. Porównaj ten jsFiddle z tym jsFiddle .
Sparky,
Interesujące @Sparky, twoje skrzypce są doskonałym dowodem. Muszę wrócić i spojrzeć na kod naprawiony za pomocą tego rozwiązania i dowiedzieć się, dlaczego doszedłem do wniosku, że musi on znajdować się w module obsługi gotowej dla DOM. To musiał być inny powód.
Kevin Zych
Justin wyjaśnia, dlaczego uruchamianie wewnątrz dokumentu doc ​​powoduje problemy. Jednak ta odpowiedź nie jest dobrą opcją, ponieważ trudno jest zagwarantować, że coś poza przygotowaniem doc będzie działać PRZED przygotowaniem doc. Doc.ready nie będzie czekał na uruchomienie skryptów poza nim. Nic osobistego, ale to nie jest wiarygodna odpowiedź.
AaronLS,
Nareszcie mam odpowiedź. Dziękuję bardzo
sp9
29

Więc zamierzam głębiej zastanowić się, dlaczego to nie działa, ponieważ jestem osobą, która nie może spać w nocy bez znajomości haha. Używam jQuery validate 1.10 i Microsoft jQuery Unobtrusive Validation 2.0.20710.0, który został opublikowany 29.01.2013.

Zacząłem od wyszukania metody setDefaults w jQuery Validate i znalazłem ją w wierszu 261 niezminimalizowanego pliku. Wszystko, co naprawdę robi, to scalanie ustawień json z istniejącymi, $.validator.defaultsktóre są inicjowane z właściwością ignore ustawioną na „: hidden” wraz z innymi ustawieniami domyślnymi zdefiniowanymi w jQuery Validate. W tym momencie zastąpiliśmy ignorowanie. Zobaczmy teraz, do której strony odwołuje się ta domyślna właściwość.

Kiedy prześledziłem kod, aby zobaczyć, do kogo $.validator.defaultssię odwołuje. Zauważyłem, że jest używany tylko przez konstruktor do sprawdzania poprawności formularza, wiersz 170 w jQuery sprawdza poprawność nieuprawnionego pliku.

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

W tym momencie walidator scali wszelkie ustawienia domyślne, które zostały ustawione i dołącza je do walidatora formularza. Kiedy patrzysz na kod, który wykonuje sprawdzanie poprawności, wyróżnianie, odznaczanie itp., Wszyscy używają obiektu validator.settings, aby pobrać właściwość ignore. Musimy więc upewnić się, że jeśli mamy ustawić ignorowanie za pomocą metody setDefaults, to musi to nastąpić przed wywołaniem $ („form”). Validate ().

Jeśli używasz Asp.net MVC i dyskretnej wtyczki, po obejrzeniu javascript zrozumiesz, że sprawdzanie poprawności jest wywoływane w document.ready. Nazwałem też mój setDefaults w dokumencie. Blok, który będzie wykonywany po skryptach, sprawdzanie poprawności jquery i dyskretne, ponieważ zdefiniowałem te skrypty w html przed tym, w którym jest wywołanie. Moje połączenie oczywiście nie miało wpływu na domyślną funkcję pomijania ukrytych elementów podczas sprawdzania poprawności. Jest tu kilka opcji.

Opcja 1 - Możesz, jak zauważył Juan Mellado, mieć wywołanie poza dokumentem. Już to wykona się, gdy tylko skrypt zostanie załadowany. Nie jestem pewien co do czasu, ponieważ przeglądarki mogą teraz wykonywać równoległe ładowanie skryptów. Jeśli jestem zbyt ostrożny, popraw mnie. Są też prawdopodobnie sposoby na obejście tego, ale na moje potrzeby nie poszedłem tą ścieżką.

Opcja 2a - Bezpiecznym zakładem w moich oczach jest po prostu zastąpienie $.validator.setDefaults({ ignore: '' });wnętrza dokumentu. Gotowym wydarzeniem $("form").data("validator").settings.ignore = "";. Spowoduje to modyfikację właściwości ignorowania, która jest faktycznie używana przez sprawdzanie poprawności jQuery podczas wykonywania każdego sprawdzania poprawności elementów w danym formularzu.

Opcje 2b - po dokładniejszym zapoznaniu się z kodem można również użyć $("form").validate().settings.ignore = "";jako sposobu ustawienia właściwości ignorowania. Powodem jest to, że patrząc na funkcję sprawdzania poprawności sprawdza, czy obiekt sprawdzania poprawności został już zapisany dla elementu formularza za pośrednictwem $.data()funkcji. Jeśli znajdzie obiekt walidatora przechowywany z elementem formularza, wówczas po prostu zwróci obiekt walidatora zamiast tworzyć inny.

JustinMichaels
źródło
Dziękuję za szczegółową odpowiedź!
davidallyoung
Dobra robota, ponieważ odpowiedź OP nie zadziałała dla mnie w MVC 5
Mark Homer,
Twoja analiza bardzo mi pomogła w rozwiązaniu jednego z moich problemów z walidacją. +1
pgcan
15

To działało dla mnie na stronie ASP.NET. Aby włączyć sprawdzanie poprawności w niektórych ukrytych polach, użyj tego kodu

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

Aby włączyć sprawdzanie poprawności wszystkich elementów formularza, użyj tego $("form").data("validator").settings.ignore = "";

Pamiętaj, że używaj ich w ciągu $(document).ready(function() { })

angela.mirjalili
źródło
8

Właśnie dodane ignore: []do konkretnej strony dla konkretnego formularza, to rozwiązanie działało dla mnie.

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });
Kiran
źródło
1

To działa dla mnie.

jQuery("#form_name").validate().settings.ignore = "";
Waqas Bukhary
źródło
0

Sprawdzanie poprawności działało dla mnie przy przesyłaniu formularzy, ale nie przeprowadzało sprawdzania poprawności opartej na zdarzeniach reaktywnych na danych wejściowych do wybranych list wyboru.

Aby to naprawić, dodałem następujące polecenie, aby ręcznie uruchomić zdarzenie sprawdzania poprawności jquery, które jest dodawane przez bibliotekę:

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

jquery.validate doda teraz .validklasę do podstawowej listy wyboru.

Uwaga: Wymaga to spójnego wzorca HTML dla danych wejściowych formularza. W moim przypadku każde złożone wejście jest owinięte w div.form-group, a każde wejście ma .form-control.

Zze
źródło
-15

Wystarczy znaleźć tekst zignoruj: „: ukryty” w pliku sprawdzania poprawności jquery i skomentuj go. Po skomentowaniu to nigdy nie straci żadnych ukrytych elementów w celu sprawdzenia ...

Dzięki

użytkownik835525
źródło
5
Nigdy nie jest dobrym pomysłem losowe komentowanie kodu w bibliotece innej firmy.
Jacques