44 votes

Comment valider un formulaire avec plusieurs cases à cocher pour qu'au moins une d'entre elles soit cochée ?

J'essaie de valider un formulaire à l'aide du plugin validate pour jquery. Je veux exiger que l'utilisateur coche au moins une case dans un groupe pour que le formulaire soit soumis. Voici mon code jquery :

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

et voici le formulaire 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">

Le problème est que le formulaire est soumis même si rien n'est coché. Comment puis-je résoudre ce problème ?

0 votes

Les éléments de votre nom ne devraient-ils pas être un tableau sous la forme de name="list[]" de toute façon ?

52voto

Vincent P Points 401
  $('#subscribeForm').validate( {
      rules: {
          list: {
              required: true,
              minlength: 1
          }
       }
   });

Je pense que cela permettra d'en vérifier au moins un.

1 votes

Je ne sais pas pourquoi, mais lorsque j'ajoute cette règle, les autres règles ne fonctionnent pas comme prévu. Par exemple, j'ai "règle 1" pour la zone de texte et "règle 2" pour la case à cocher de la liste. Si la "règle 2" est satisfaite, le formulaire est soumis, quelle que soit la "règle 1". En revanche, si la "règle 2" n'est pas satisfaite, l'erreur de la "règle 2" est signalée. Si les deux règles ne sont pas satisfaites, les deux erreurs sont signalées.

1 votes

Je pense que "requis" est suffisant (je ne sais pas si minlength est également nécessaire). Vous pourriez vouloir le mettre dans le js, mais le simple fait d'ajouter l'attribut "required" aux entrées elles-mêmes fera également l'affaire.

33voto

Evildonald Points 1777

Ce script ci-dessous devrait vous mettre sur la bonne voie peut-être ?

Vous pouvez garder le même html (bien que j'ai changé la méthode en 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>

et ce javascript valide

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)

et vous pouvez trouver un exemple de travail ici

MISE À JOUR (octobre 2012)
En outre, il convient de noter que les cases à cocher doit avoir une propriété "name", sinon ils ne seront pas ajoutés au tableau. Le fait de n'avoir que la propriété "id" ne fonctionnera pas.

MISE À JOUR (mai 2013)
Déplacement de l'enregistrement du submit en javascript et enregistrement du submit sur le formulaire (comme il aurait dû l'être à l'origine)

MISE À JOUR (juin 2016)
Modifications == à ===

6 votes

Pourquoi utiliser onsubmit (sur le bouton au lieu du formulaire, pas moins !) au lieu de $('form').submit(function() {...}) ?

1 votes

Er, devrait être $('#subscribeForm').submit(...)

1 votes

Cela fonctionne, mais comme j'aurais dû le préciser dans ma question initiale, j'essaie d'utiliser le plugin de validation parce que le formulaire actuel est plus complexe et que j'essaie de valider un certain nombre d'autres éléments. Les autres champs sont validés sans problème ; c'est juste le groupe de cases à cocher qui pose problème. Ma question est donc de savoir si je peux faire en sorte que le plugin de validation fasse quelque chose comme ceci.

14voto

jgeewax Points 3026

Que dites-vous de ça ?

$(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
        }
    });
});

1 votes

C'est une méthode très douce et rapide, j'aime ça !

4 votes

Mais n'utilise pas le plugin jQuery Validate comme demandé par le PO.

0 votes

Je ne peux pas voir l'historique des révisions de la question, mais je ne pense pas que la version originale mentionnait le plugin Validate. Mais je peux me tromper...

9voto

Stefan Morrow Points 101

L'addMethod de Lod Lawson ci-dessus n'est pas complètement correct. C'est $.validator et non $.validate et le nom de la méthode du validateur cb_selectone nécessite des guillemets. Voici une version corrigée que j'ai testée :

$.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');

6voto

alexborbely Points 161

Voici une solution rapide pour la validation de plusieurs cases à cocher à l'aide du plugin de validation 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();
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X