2009-10-08 9 views
38

Próbuję sprawdzić poprawność formularza za pomocą wtyczki sprawdzania poprawności dla jquery. Chcę wymagać, aby użytkownik zaznaczył co najmniej jedno pole wyboru w grupie w celu przesłania formularza. Oto mój kod jquery:Jak sprawdzać poprawność formularza z wieloma polami wyboru, aby mieć co najmniej jedną zaznaczoną

$().ready(function() { 
$("#subscribeForm").validate({ 
    rules: { list: {required: "#list0:checked"} }, 
    messages: { list: "Please select at least one newsletter"}               
}); 
}); 

i oto formularz html:

<form action="" method="GET" id="subscribeForm"> 
<fieldset id="cbgroup"> 
    <div><input name="list" id="list0" type="checkbox" value="newsletter0" >zero</div> 
    <div><input name="list" id="list1" type="checkbox" value="newsletter1" >one</div> 
    <div><input name="list" id="list2" type="checkbox" value="newsletter2" >two</div> 
</fieldset> 
<input name="submit" type="submit" value="submit"> 

Problemem jest to, że forma podnosi nawet jeśli nic nie jest zaznaczone. Jak mogę to rozwiązać?

+0

nie powinno się swoimi elementy nazwa być tablicą w postaci listy name = "[]" tak? – JM4

Odpowiedz

31

Ten skrypt poniżej może postawić Cię na dobrej drodze?

Można zachować ten html samo (choć zmieniłem metodę POST):

<form method="POST" id="subscribeForm"> 
    <fieldset id="cbgroup"> 
     <div><input name="list" id="list0" type="checkbox" value="newsletter0" >zero</div> 
     <div><input name="list" id="list1" type="checkbox" value="newsletter1" >one</div> 
     <div><input name="list" id="list2" type="checkbox" value="newsletter2" >two</div> 
    </fieldset> 
    <input name="submit" type="submit" value="submit"> 
</form> 

i to javascript sprawdza

function onSubmit() 
{ 
    var fields = $("input[name='list']").serializeArray(); 
    if (fields.length === 0) 
    { 
     alert('nothing selected'); 
     // cancel submit 
     return false; 
    } 
    else 
    { 
     alert(fields.length + " items selected"); 
    } 
} 

// register event on form, not submit button 
$('#subscribeForm').submit(onSubmit) 

można znaleźć working example of it here

AKTUALIZACJA (październik 2012)
Dodatkowo należy zauważyć, że chec kboxes musi mieć właściwość "nazwa", inaczej nie zostaną dodane do tablicy. Tylko posiadanie "id" nie będzie działać.

UPDATE (maj 2013),
przeniósł złożyć rejestracyjne javascript i zarejestrowany złożyć na formularzu (jak powinno być pierwotnie)

UPDATE (czerwiec 2016)
Zmiany == do ===

+6

Dlaczego używać 'onsubmit' (na przycisku zamiast formularza, nie mniej!) Zamiast' $ ('formularz'). Submit (function() {...}) '? – eyelidlessness

+1

Er, powinno być '$ ('# subscribeForm'). Submit (...)' – eyelidlessness

+1

To działa, ale jak powinienem był wyjaśnić w moim pierwotnym pytaniu, próbuję użyć wtyczki sprawdzania poprawności ponieważ faktyczne Formularz jest bardziej złożony i próbuję potwierdzić kilka innych rzeczy. Pozostałe pola sprawdzają się poprawnie; to tylko grupa checkboxowa jest problematyczna. Tak naprawdę, moje pytanie brzmi, czy mogę uzyskać wtyczkę sprawdzania poprawności, aby zrobić coś takiego. – jalperin

11

Jak o tym:

$(document).ready(function() { 
    $('#subscribeForm').submit(function() { 
     var $fields = $(this).find('input[name="list"]:checked'); 
     if (!$fields.length) { 
      alert('You must check at least one box!'); 
      return false; // The form will *not* submit 
     } 
    }); 
}); 
+0

to bardzo gładka i szybka droga, podoba mi się! – Luci

+2

Ale nie używa wtyczki jQuery Validate zgodnie z żądaniem OP. –

+0

Nie widzę historii wersji pytania, ale nie sądzę, że oryginalna wersja wspomniała wtyczkę Validate. Mogę się mylić chociaż ... –

51
$('#subscribeForm').validate({ 
     rules: { 
      list: { 
       required: true, 
       minlength: 1 
      } 
     } 
    }); 

Myślę, że to sprawi, że przynajmniej jeden jest sprawdzany.

+1

Nie wiem dlaczego, ale kiedy dodaję tę zasadę, inne zasady nie działają zgodnie z oczekiwaniami. Takich jak, mam "rule1" dla pola tekstowego i "rule2" dla listy wyboru. Jeśli "rule2" zostanie spełnione, formularz zostanie przesłany niezależnie od "reguły1". Z drugiej strony, jeśli "rule2" nie jest spełniony, zgłasza błąd "rule2". Jeśli oba nie są spełnione, zgłaszane są oba błędy. –

+0

działa dla mnie (Y) –

+1

Myślę, że "wymagany" jest wystarczający (nie jestem pewien, czy minimalna długość jest również konieczna).Możesz umieścić go w js, ale samo dodanie wymaganego atrybutu do samych danych wejściowych również wykona to zadanie. – jinglesthula

1

Jak o tym

$.validate.addMethod(cb_selectone, 
        function(value,element){ 
          if(element.length>0){ 
           for(var i=0;i<element.length;i++){ 
           if($(element[i]).val('checked')) return true; 
           } 
          return false; 
          } 
          return false; 
        }, 
        'Please select a least one') 

Teraz ca zrobić

$.validate({rules:{checklist:"cb_selectone"}}); 

Można nawet pójść ponadto określić minimalną liczbę, aby wybrać z trzecim param w function.I zwrotnych nie testowane jeszcze mi powiedz, czy to działa.

9

Powyższy addMethod napisany przez Lod Lawsona nie jest całkowicie poprawny. To $ .validator, a nie $ .validate, a nazwa metody walidatora cb_selectone wymaga wyceny.Oto poprawiona wersja, że ​​testowane:

$.validator.addMethod('cb_selectone', function(value,element){ 
    if(element.length>0){ 
     for(var i=0;i<element.length;i++){ 
      if($(element[i]).val('checked')) return true; 
     } 
     return false; 
    } 
    return false; 
}, 'Please select at least one option'); 
6

Oto szybkie rozwiązanie do wielokrotnego sprawdzania pole wyboru przy użyciu plugin sprawdzania poprawności jquery:

jQuery.validator.addMethod('atLeastOneChecked', function(value, element) { 
    return ($('.cbgroup input:checked').length > 0); 
}); 

$('#subscribeForm').validate({ 
    rules: { 
    list0: { atLeastOneChecked: true } 
    }, 
    messages: { 
    list0: { 'Please check at least one option' } 
    } 
}); 

$('.cbgroup input').click(function() { 
    $('#list0').valid(); 
}); 
0

musiałem zrobić to samo i to jest to, co ja wrote.I staje się on bardziej elastyczny w moim przypadku jak miałem wielokrotne grupy pól wyboru w celu sprawdzenia.

// param: reqNum number of checkboxes to select 
$.fn.checkboxValidate = function(reqNum){ 
    var fields = this.serializeArray(); 
    return (fields.length < reqNum) ? 'invalid' : 'valid'; 
} 

Następnie można przekazać tę funkcję, aby sprawdzić wiele grup pól wyboru z wieloma regułami.

// helper function to create error 
function err(msg){ 
    alert("Please select a " + msg + " preference."); 
} 

$('#reg').submit(function(e){ 
    //needs at lease 2 checkboxes to be selected 
    if($("input.region, input.music").checkboxValidate(2) == 'invalid'){ 
     err("Region and Music"); 
    } 
}); 
0

Miałem zupełnie inny scenariusz. Moje pola wyboru zostały utworzone dynamicznie i nie należały do ​​tej samej grupy. Ale przynajmniej jeden z nich musiał zostać sprawdzony. Moje podejście (nigdy powiedzieć, że jest doskonały), stworzyłem genric walidator dla nich wszystkich:

jQuery.validator.addMethod("validatorName", function(value, element) { 
    if (($('input:checkbox[name=chkBox1]:checked').val() == "Val1") || 
     ($('input:checkbox[name=chkBox2]:checked').val() == "Val2") || 
     ($('input:checkbox[name=chkBox3]:checked').val() == "Val3")) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    }  
}, "Please Select any one value"); 

Teraz miałem skojarzyć każdy z chkbox do tego jednego weryfikatora.

Ponownie musiałem uruchomić sprawdzanie poprawności po kliknięciu dowolnego z pól wyboru, uruchamiając narzędzie sprawdzania poprawności.

$('#piRequest input:checkbox[name=chkBox1]').click(function(e){ 
    $("#myform").valid(); 
}); 
0
if (
document.forms["form"]["mon"].checked==false && 
document.forms["form"]["tues"].checked==false && 
document.forms["form"]["wed"].checked==false && 
document.forms["form"]["thrs"].checked==false && 
document.forms["form"]["fri"].checked==false 
) 
{ 
alert("Select at least One Day into Five Days"); 
return false; 
} 
Powiązane problemy