Walidacja grupy przycisków opcji przy użyciu wtyczki walidacji jQuery


131

Jak przeprowadzić walidację dla grupy przycisków radiowych (należy wybrać jeden przycisk radiowy) za pomocą wtyczki do walidacji jQuery?


Sprawdź odpowiedź od c.reeves na forum.jquery.com/topic/ ...

Dostępny jest nowy walidator jQuery, który jest bardzo wydajny i łatwy w użyciu. Możesz to sprawdzić: code.google.com/p/bvalidator
Nenad

nie chcę włączać całej biblioteki do czegoś tak prostego
Doug Molineux,

Odpowiedzi:


113

W nowszych wersjach jquery (myślę, że 1.3+), wszystko co musisz zrobić, to ustawić jednego z członków radia na wymagany, a jquery zajmie się resztą:

<input type="radio" name="myoptions" value="blue" class="required"> Blue<br />
<input type="radio" name="myoptions" value="red"> Red<br />
<input type="radio" name="myoptions" value="green"> Green

Powyższe wymagałoby wybrania co najmniej 1 z 3 opcji radiowych z nazwą „moje opcje” przed kontynuowaniem.

Przy okazji, propozycja etykiety Mahesa działa cudownie!


To jest teraz najlepsza odpowiedź dla mnie dzięki aktualizacjom jQuery. +1.
Kieran Andrews,

6
Jedynym problemem jest to, że gdy żaden z nich nie jest zaznaczony, jQuery validate podświetla pierwszy przycisk opcji na czerwono, ale w rzeczywistości prawdopodobnie chcesz podświetlić WSZYSTKIE z nich. Ponadto po zaznaczeniu dowolnego przycisku opcji czerwony powinien zniknąć.
Haacked

2
@Haacked Możesz użyć funkcji wywołania zwrotnego errorPlacement w opcjach walidacji, aby umieścić komunikat o błędzie w jakimś sensownym miejscu?
autonomatt

2
@Haacked: dodanie focusInvalid: falsedo validate()opcji zapobiegnie podświetleniu pierwszego przycisku opcji.
Jim Miller

2
Zawsze robię to w ten sposób i umieszczam etykietę błędu w funkcji errorPlacement. Oto co robię dla przycisków radiowych: if (element.is ("input: radio")) {error.insertAfter (element.parent ()); } else {error.insertAfter (element); }
Francisco Goldenstein

25

użyj następującej reguły do ​​weryfikacji wyboru grupy przycisków opcji

myRadioGroupName : {required :true}

myRadioGroupName to wartość, którą nadałeś atrybutowi nazwy


15
Zwróć uwagę, że jeśli chcesz kontrolować położenie etykiety, możesz podać własną etykietę błędu tam, gdzie chcesz, z żądanym tekstem: <label for = "myRadioGroupName" class = "error" style = "display: none; "> Wybierz jedną. </label>
Tom

@Tom nie ma sensu pisać samodzielnie labeltagu błędu, w rzeczywistości wtyczka automatycznie dodaje ten tag z etykietą błędu.
ahmehri

3
Raczej dawno temu, ale wyobrażam sobie, co próbowałem zrobić, to umieścić <label> w innym miejscu w DOM, a nie tam, gdzie został on automatycznie utworzony przez wtyczkę. Jest również całkiem możliwe, że zachowanie wtyczki zmieniło się w ciągu ostatnich 5 lat ...
Tomek

Smutne, jak wymaga tutaj „nazwy” zamiast „typu” dla niestandardowych błędów.
justdan23

19

Możesz również użyć tego:

<fieldset>
<input type="radio" name="myoptions[]" value="blue"> Blue<br />
<input type="radio" name="myoptions[]" value="red"> Red<br />
<input type="radio" name="myoptions[]" value="green"> Green<br />
<label for="myoptions[]" class="error" style="display:none;">Please choose one.</label>
</fieldset>

i po prostu dodaj tę regułę

rules: {
 'myoptions[]':{ required:true }
}

Wspomnij, jak dodać reguły.


1
Ale to spowodowałoby błędy w walidacji HTML5, ponieważ uważam, że atrybut for musi być odniesieniem do identyfikatora (którego nie możemy ustawić 3 przycisków radiowych na ten sam identyfikator).
armyofda12mnkeys

1
Istnieje DUŻA różnica między atrybutem nazwy a atrybutem id.
Norman H

2
Proszę nie zwracać uwagi na to, że przycisk opcji powinien zwracać tylko jedną wartość, w związku z czym name="myoptions[]"jest to nieco zagmatwane, ponieważ wskazuje, że można zwrócić wiele wartości.
Rafael Herscovici

Umieszcza komunikat o błędzie u góry. <styl> .radio-group {pozycja: względna; margin-top: 40px; } # myoptions-error {pozycja: bezwzględna; góra: -25px; } </style> <div class = "radio-group"> <input type = "radio" name = "myoptions" value = "blue" class = "required"> Niebieski <br /> <input type = "radio" name = "myoptions" value = "red"> Czerwony <br /> <input type = "radio" name = "myoptions" value = "green"> Green </div> </div> <! - end radio- grupa ->
Sonobor

4

Zgodnie z odpowiedzią Brandona. Ale jeśli używasz ASP.NET MVC, który używa dyskretnej weryfikacji, możesz dodać atrybut data-val do pierwszego. Lubię też mieć etykiety dla każdego przycisku opcji w celu ułatwienia korzystania.

<span class="field-validation-valid" data-valmsg-for="color" data-valmsg-replace="true"></span>
<p><input type="radio" name="color" id="red" value="R" data-val="true" data-val-required="Please choose one of these options:"/> <label for="red">Red</label></p>
<p><input type="radio" name="color" id="green" value="G"/> <label for="green">Green</label></p>
<p><input type="radio" name="color" id="blue" value="B"/> <label for="blue">Blue</label></p>

3

Inny sposób weryfikacji jest taki.

var $radio = $('input:radio[name="nameRadioButton"]');
$radio.addClass("validate[required]");

Mam nadzieję, że mój przykład ci pomoże


2

Miałem ten sam problem. Wystarczy napisać niestandardową funkcję podświetlania i usuwania podświetlenia dla walidatora. Dodanie tego do opcji walidacji powinno dodać klasę błędu do elementu i jego odpowiedniej etykiety:

        'highlight': function (element, errorClass, validClass) {
            if($(element).attr('type') == 'radio'){
                $(element.form).find("input[type=radio]").each(function(which){
                    $(element.form).find("label[for=" + this.id + "]").addClass(errorClass);
                    $(this).addClass(errorClass);
                });
            } else {
                $(element.form).find("label[for=" + element.id + "]").addClass(errorClass);
                $(element).addClass(errorClass);
            }
        },
        'unhighlight': function (element, errorClass, validClass) {
            if($(element).attr('type') == 'radio'){
                $(element.form).find("input[type=radio]").each(function(which){
                    $(element.form).find("label[for=" + this.id + "]").removeClass(errorClass);
                    $(this).removeClass(errorClass);
                });
            }else {
                $(element.form).find("label[for=" + element.id + "]").removeClass(errorClass);
                $(element).removeClass(errorClass);
            }
        },

2

kod przycisku opcji -

<div>
<span class="radio inline" style="margin-right: 10px;">@Html.RadioButton("Gender", "Female",false) Female</span>
<span class="radio inline" style="margin-right: 10px;">@Html.RadioButton("Gender", "Male",false) Male</span>                                                        
<div class='GenderValidation' style="color:#ee8929;"></div>    
</div> 

<input class="btn btn-primary" type="submit" value="Create" id="create"/>

i kod jQuery-

<script>
    $(document).ready(function () {
        $('#create').click(function(){

            var gender=$('#Gender').val();
            if ($("#Gender:checked").length == 0){
                $('.GenderValidation').text("Gender is required.");
                return false;
            }
        });
    });
</script>

0

Umieszcza komunikat o błędzie u góry.

   <style> 

 .radio-group{ 
      position:relative; margin-top:40px; 
 } 

 #myoptions-error{ 
     position:absolute; 
     top: -25px; 
  } 

 </style> 

 <div class="radio-group"> 
 <input type="radio" name="myoptions" value="blue" class="required"> Blue<br /> 
 <input type="radio" name="myoptions" value="red"> Red<br /> 
 <input type="radio" name="myoptions" value="green"> Green </div>
 </div><!-- end radio-group -->
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.