web-dev-qa-db-fra.com

Boucle à travers les cases à cocher et compte chacun coché ou non coché

J'ai rencontré un petit problème. Voici une brève explication.

J'ai 12 cases à cocher sur un formulaire standard. Ce que je dois faire est de parcourir chacun d’entre eux et d’apprendre lesquels sont cochés et ceux qui ne le sont pas. 

En utilisant cela, je peux ensuite construire une chaîne que je saisis ensuite dans un champ de base de données. Voici un exemple. 

(Check1 - vérifié)
(Check2 - pas coché)
(Check3 - vérifié)

1,0,1

Jusqu'ici, j'ai ce morceau de code. 

$('input[type=checkbox]').each(function () {
           if (this.checked) {
               console.log($(this).val()); 
           }
});

Cela fonctionne parfaitement sauf que cela ne ramène que les vérifiés, pas tous. 

Désolé pour la question newb. Je suis un peu nouveau à JQuery.

67
Richard M

Pour construire une chaîne de résultat exactement au format que vous indiquez, vous pouvez utiliser ceci:

var sList = "";
$('input[type=checkbox]').each(function () {
    sList += "(" + $(this).val() + "-" + (this.checked ? "checked" : "not checked") + ")";
});
console.log (sList);

Cependant, je suis d’accord avec @SLaks, je pense que vous devriez revoir la structure dans laquelle vous allez la stocker dans votre base de données.

EDIT: Désolé, j'ai mal lu le format de sortie que vous recherchiez. Voici une mise à jour:

var sList = "";
$('input[type=checkbox]').each(function () {
    var sThisVal = (this.checked ? "1" : "0");
    sList += (sList=="" ? sThisVal : "," + sThisVal);
});
console.log (sList);
109
Ed Schembor

Utiliser des sélecteurs

Vous pouvez obtenir toutes les cases à cocher cochées comme ceci:

var boxes = $(":checkbox:checked");

Et tout non vérifié comme ça:

var nboxes = $(":checkbox:not(:checked)");

Vous pouvez simplement parcourir l'une ou l'autre de ces collections et stocker ces noms. Si quelque chose est absent, vous savez que cela a été vérifié ou non. En PHP, si vous avez coché un tableau de noms, vous pouvez simplement faire une requête in_array() pour savoir si une case particulière doit être cochée ultérieurement.

Sérialiser

jQuery a également une méthode serialize qui conservera l’état de vos contrôles de formulaire. Par exemple, l'exemple fourni sur le site Web de jQuery est le suivant:

single=Single2&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio2

Cela vous permettra de conserver également les informations pour lesquelles les éléments ont été vérifiés.

58
Sampson

Vous pouvez parcourir toutes les cases en écrivant $(':checkbox').each(...).

Si je comprends bien votre question, vous recherchez le code suivant:

var str = "";

$(':checkbox').each(function() {
    str += this.checked ? "1," : "0,";
});

str = str.substr(0, str.length - 1);    //Remove the trailing comma

Ce code parcourt toutes les cases à cocher et ajoute 1, ou 0, à une chaîne.

15
SLaks

Je ne pense pas que suffisamment de temps ait été consacré aux considérations de schéma évoquées dans le message d'origine. Donc, voici quelque chose à considérer pour tout débutant.

Supposons que vous ayez créé cette solution. Toutes vos valeurs secondaires sont regroupées en une seule valeur et stockées dans la base de données. Vous économisez en effet un peu d'espace dans votre base de données et un peu de codage temporel.

Considérons maintenant que vous devez effectuer la tâche fréquente et facile consistant à ajouter une nouvelle case à cocher entre les cases à cocher actuelles 3 et 4. Votre responsable du développement, client, n’attend que ce changement.

Donc, vous ajoutez la case à cocher à l'interface utilisateur (la partie facile). Votre code en boucle concaténerait déjà les valeurs, peu importe le nombre de cases à cocher. Vous estimez également que votre champ de base de données est simplement un type varchar ou un autre type de chaîne, de sorte qu'il devrait également convenir.

Que se passe-t-il lorsque les clients ou vous-même essayez d’afficher les données antérieures au changement? Vous sérialisez essentiellement de gauche à droite. Cependant, maintenant, les valeurs après 3 sont toutes désactivées d'un caractère. Qu'allez-vous faire avec toutes vos données existantes? Allez-vous écrire une application, la retirer de la base de données, la traiter pour ajouter une valeur par défaut à la nouvelle position de la question, puis la stocker dans la base de données? Que se passe-t-il lorsque vous avez plusieurs nouvelles valeurs une semaine ou un mois d'intervalle? Que faire si vous déplacez les emplacements et que jQuery les traite dans un ordre différent? Toutes vos données sont archivées et doivent être retraitées à nouveau pour les réorganiser.

Tout le concept de PAS fournissant une relation clé-valeur étroite est ludacris et finira par vous causer des ennuis le plus tôt possible. Pour ceux d'entre vous qui envisagent cela, s'il vous plaît ne le faites pas. Les autres suggestions de modification de schéma conviennent. Utilisez une table enfant, davantage de champs dans la table principale, une table de questions-réponses, etc. Ne stockez pas de données non étiquetées lorsque leur structure est susceptible de changer.

0
Nathon