probleme avec une checkbox tous/aucun

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : probleme avec une checkbox tous/aucun

par VaN » 20 juin 2006, 11:43

J'ai essayé d'implementer ta technique, mais je me retrouve avec cette erreur JS :
Erreur : document.all has no properties
Fichier source : http://127.0.0.1/Mailing/mail02.php
Ligne : 104
Voici ma liste de checkbox générée, je ne crois pas qu'il y est d'erreurs (l'oubli de la fonction cocher_decocher_parent() est intentionnel, je n'en ai pas besoin).

Code : Tout sélectionner

<form action="/Mailing/mail02.php" method="POST" name="menu" id="menu"> <input id="all" type="checkbox" onclick="check_all()" name="all"> All <ul class="menu"> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(0)" name="parent[]" value="1" >E-sports <ul> <li><input id="fils[0]" type="checkbox" name="fils[0][0]" value="[email protected]"><img src="images/flags/fr.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.esportsfrance.com<a href="fiche.php?id=1"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <li><input id="fils[0]" type="checkbox" name="fils[0][1]" value="[email protected]"><img src="images/flags/eu.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.xfire.com<a href="fiche.php?id=11"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> </ul> </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(1)" name="parent[]" value="2" >Counter-Strike <ul> <li><input id="fils[1]" type="checkbox" name="fils[1][0]" value="[email protected]"><img src="images/flags/fr.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.goodgame.fr<a href="fiche.php?id=12"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <li><input id="fils[1]" type="checkbox" name="fils[1][1]" value="[email protected]"><img src="images/flags/nl.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.counter-strike.net<a href="fiche.php?id=3"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <li><input id="fils[1]" type="checkbox" name="fils[1][2]" value="[email protected]"><img src="images/flags/nl.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.team-aaa.com<a href="fiche.php?id=5"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> </ul> </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(2)" name="parent[]" value="3" >WarCraft III <ul> <li><input id="fils[2]" type="checkbox" name="fils[2][0]" value="[email protected]"><img src="images/flags/world.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.w3replays.com<a href="fiche.php?id=6"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> </ul> </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(3)" name="parent[]" value="4" >PES 5 <ul> <li><input id="fils[3]" type="checkbox" name="fils[3][0]" value="[email protected]"><img src="images/flags/eu.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.pes-online.com<a href="fiche.php?id=7"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> </ul> </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(4)" name="parent[]" value="8" >Test</li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(5)" name="parent[]" value="9" >categorie 1</li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(6)" name="parent[]" value="10" >categorie 2</li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(7)" name="parent[]" value="11" >categorie 3</li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(8)" name="parent[]" value="12" >categorie 6</li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(9)" name="parent[]" value="13" >categorie 9</li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(10)" name="parent[]" value="14" >categorie 10</li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="parent" type="checkbox" onChange="cocher_decocher_fils(11)" name="parent[]" value="15" >categorie 11</li> </ul> </form>

par sadeq » 19 juin 2006, 14:54

Voici une solution qui consiste à créer les parents et les fils dans des tableaux
Les parents dans un tableau à une dimension
Les fils dans un tableau à 2 dimensions (où la première correspond au parents)

Ceci donne une liste hiérachique qu'on peut exploiter par index
Ainsi l'accès aux fils d'un parent connu par i s'écrit : fils[0..n]

Quand on sélectionne alors un parent i, on peut traiter ses fils[x] dans une boucle x=0 à fils.length

Manipuler des checkbox sous JS et PHP
Ceci dit, sous jS un tableau d'objets est créé si les objets constituant le tableau sont identifiés par un même id.
exemple:

Code : Tout sélectionner

<input type=checkbox id="check" checked> <input type=checkbox id="check"> <input type=checkbox id="check" checked>
ici, JS récupère un tableau nommé "check" qui contient 3 objets [0], [1] et [2] dont 2 objets cochés ([0] et [2]) et 1 objet décoché ([1])

Par contre PHP récupère dans un tableau les checkbox cochés ayant le même nom suivi d'un index x spécifié ou ignoré de la forme nom[x] selon 2 cas :

1. quand les checkbox sont nommés par le même nom en spécifiant leur index, PHP récupère tous les checkbox cochés en conervant leur index d'origine dans l'ordre.
exemple :
<input type=checkbox name="check[1]" checked>
<input type=checkbox name="check[2]">
<input type=checkbox name="check[3]" checked>
ici, php reçoit un tableau $_GET["check"] contenant les index [1] et [3] qui sont les index d'origine des check cochés


2. quand les checkbox sont nommés par le même nom sans spécifier leur index, PHP récupère tous les checkbox cochés sans conerver l'ordre d'origine.
exemple :
<input type=checkbox name="check[]" checked>
<input type=checkbox name="check[]">
<input type=checkbox name="check[]" checked>
ici, php reçoit un tableau $_GET["check"] contenant les index [0] et [1] arbitrairement les check cochés

Remarque :
  • PHP ne reçoit pas les champs nommés par "id" mais ceux nommés par "name" et incrustés dans un form
    PHP ne reçoit jamais les check décochés

Proposition:

Code : Tout sélectionner

<form> <div> <input type=checkbox id="parent" name="parent[0]" onChange="cocher_decocher_fils(0)"><b>Titre parent</b> <ul><input type=checkbox id="fils[0]" name="fils[0][0]" onChange="cocher_decocher_parent(0)"><b>Titre fils 1</b></ul> <ul><input type=checkbox id="fils[0]" name="fils[0][1]" onChange="cocher_decocher_parent(0)"><b>Titre fils 2</b></ul> </div> <div> <input type=checkbox id="parent" name="parent[1]" onChange="cocher_decocher_fils(1)"><b>Titre parent</b> <ul><input type=checkbox id="fils[1]" name="fils[1][0]" onChange="cocher_decocher_parent(1)"><b>Titre fils 1</b></ul> <ul><input type=checkbox id="fils[1]" name="fils[1][1]" onChange="cocher_decocher_parent(1)"><b>Titre fils 2</b></ul> </div> <input type=submit name="envoyer" value="Envoyer"> </form> <script> //cocher_decocher_fils : //si le parent est coché ou décoché, tous ses fils ont le même état function cocher_decocher_fils(cle_parent){ //Accès au noeud parent à l'index cle_parent = 1 parent indexé par cle_parent var parent = document.all["parent"][cle_parent]; //Accès au noeud fils[cle_parent] = un tableau des fils du parent indexé par cle_parent var fils = document.all["fils["+cle_parent+"]"]; //Traitement des fils for (i=0; i<fils.length; i++){ //Etat coché du fils = même état coché du parent fils[i].checked = parent.checked; } } //cocher_decocher_parent : //si au moins un des fils est coché, le parent l'est aussi. //si aucun des fils n'est coché, le parent ne l'est pas non plus function cocher_decocher_parent(cle_parent){ //Si au moins un fils est coché => parent coché var fils = document.all["fils["+cle_parent+"]"]; for (i=0; i<fils.length; i++) if (fils[i].checked) { document.all["parent"][cle_parent].checked = true; return; } //Si aucun fils n'est coché => parent non coché document.all["parent"][cle_parent].checked = false; } </script>
<?php 
//PHP reçoit les champs nommés parent et fils en tant que tableaux
echo "<pre>";
foreach ($_GET["parent"] as $cle_parent=>$aucune_valeur){
	echo "<p>Parent: $cle_parent <br>";
	print_r($_GET["fils"][$cle_parent]);
}
echo "</pre>";
?>

par VaN » 19 juin 2006, 14:12

j'ai modifié ma fonction comme conseillé. Résultat : mon probleme d'id semble reglé, lorsque je coche la case 1, seule celle ci se coche. Par contre, cela ne coche plus les checkbox filles : /

Code : Tout sélectionner

function ta(id) { var liste=document.getElementById('menu').elements; for (i=0; i<liste.length; i++) { var id_fils = liste[i].id; var id_pere = id_fils.substring(0,id.indexOf("c")); if (id_pere == id) liste[i].checked = document.getElementById(id).checked; } }

par Ryle » 19 juin 2006, 11:56

La première n'est pas spécialement compliqué, il suffit dans tes tags de liste de rajouter un id pour les distinguer :

Code : Tout sélectionner

<li><input id="1" ...> <ul id="menu1"> ... </ul> <li><input id="2" ...> <ul id="menu2"> ... </ul>
et dans ta fonction, quand on clique sur la case 1, d'aller chercher les éléments qui se trouvent englobés par la balise dont l'id est "menu1" au lieu de prendre tous les éléments de "menu" comme tu le fais actuellement...


Pour couper ta chaine au "c", il te faut utiliser la fonciton indexOf pour déterminer sa position : id.indexOf("c")
Tu peux alors faire un substring de 0 jusqu'à cet index :) (Attention : substr et substring sont deux fonctions différentes : la première prends en compte l'index de départ et le nombre de caractères, la seconde prends en compte l'index de départ et l'index d'arrivée)

par VaN » 19 juin 2006, 11:35

ouh là ça me parait bien compliqué tout ça. Ta deuxieme solution m'interesse, pourrait tu me montrer la synthaxe pour couper ma chaine juste avant le 'c' ?

par Ryle » 19 juin 2006, 11:27

Pourquoi ne pas mettre un id à tes balises <ul> lié à l'identifiant de la case qui les gère (genre menu1, menu2, ...) tu n'aurais plus alors qu'à récupérer getElementById('menu'+id).elements et cocher ou décocher toutes les cases sans te soucier de leur id ?

sinon ton problème vient de ton substring : il ne faut pas couper à la taille de id, sans quoi pour id==1 (donc longueur égale à 1), tu vas effectivement avoir tout ce qui commence par un 1 quel que soit ce qui suit :) Si tu veux tronquer ta chaine, sert toi du "c" que tu as dedans :)

sinon tu peux également vérifier que ton id_fils contient la chaine id+"c" comme ça si id==1, il n'y aura pas de confusions possible entre 1cX et 10cX :)

probleme avec une checkbox tous/aucun

par VaN » 19 juin 2006, 10:56

Bonjour,

j'ai un menu fait de checkbox, chaque checkbox possède des checkbox fille. Sur ces checkbox-mères, j'ai implémenté un script qui permet de cocher toutes les checkbox filles de chaque catégorie.

Un problème apparait :

Lorsque je coche la checkbox avec l'id 1, cela me coche également les checkbox avec l'id 10, 11, 12, etc, bref toutes celles commençant par 1.

Comment corriger ça ?

le code du menu généré en php :

Code : Tout sélectionner

<ul class="menu"> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="1" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="1" >E-sports <ul> <li><input id="1c1" type="checkbox" name="contact[]" value="[email protected]"><img src="images/flags/fr.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.esportsfrance.com<a href="fiche.php?id=1"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <script type="text/javascript">is_checked(1, "1c1");</script> <li><input id="1c2" type="checkbox" name="contact[]" value="[email protected]"><img src="images/flags/eu.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.xfire.com<a href="fiche.php?id=11"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <script type="text/javascript">is_checked(1, "1c2");</script> </ul> </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="2" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="2" >Counter-Strike <ul> <li><input id="2c1" type="checkbox" name="contact[]" value="[email protected]"><img src="images/flags/fr.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.goodgame.fr<a href="fiche.php?id=12"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <script type="text/javascript">is_checked(2, "2c1");</script> <li><input id="2c2" type="checkbox" name="contact[]" value="[email protected]"><img src="images/flags/nl.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.counter-strike.net<a href="fiche.php?id=3"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <script type="text/javascript">is_checked(2, "2c2");</script> <li><input id="2c3" type="checkbox" name="contact[]" value="[email protected]"><img src="images/flags/nl.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.team-aaa.com<a href="fiche.php?id=5"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <script type="text/javascript">is_checked(2, "2c3");</script> </ul> </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="3" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="3" >WarCraft III <ul> <li><input id="3c1" type="checkbox" name="contact[]" value="[email protected]"><img src="images/flags/world.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.w3replays.com<a href="fiche.php?id=6"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <script type="text/javascript">is_checked(3, "3c1");</script> </ul> </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="4" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="4" >PES 5 <ul> <li><input id="4c1" type="checkbox" name="contact[]" value="[email protected]"><img src="images/flags/eu.gif" align="absmiddle" border="0" style="margin-right:5px;margin-left:5px;">http://www.pes-online.com<a href="fiche.php?id=7"><img src="images/fiche.gif" align="absmiddle" border="0" style="margin-left:5px;"></a></li> <script type="text/javascript">is_checked(4, "4c1");</script> </ul> </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="5" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="8" >Test </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="6" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="9" >categorie 1 </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="7" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="10" >categorie 2 </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="8" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="11" >categorie 3 </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="9" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="12" >categorie 6 </li> <li><img src="images/plus.gif" onclick="expand(this)" align="absmiddle" /><input id="10" type="checkbox" onclick="ta(this.id)" name="cat_destinataire[]" value="13" >categorie 9 </li> </ul>
et le script JS :

Code : Tout sélectionner

function ta(id) { var liste=document.getElementById('menu').elements; for (i=0; i<liste.length; i++) { var id_fils = liste[i].id; var id_pere = id_fils.substr(0,id.length); if (id_pere == id) liste[i].checked=document.getElementById(id).checked; } }