Activer ou désactiver un bouton selon une checkbox
Résolu/Fermé
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
-
Modifié le 22 mars 2022 à 10:37
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 24 mars 2022 à 23:27
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 24 mars 2022 à 23:27
A voir également:
- Activer ou désactiver un bouton selon une checkbox
- Comment activer windows 10 - Guide
- Comment activer chromecast sur tv - Guide
- Desactiver instagram - Guide
- Activer pavé tactile windows 10 - Guide
- Desactiver windows defender - Guide
3 réponses
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
23 mars 2022 à 17:17
23 mars 2022 à 17:17
Bonjour,
Actuellement ta fonction handleChange vérifie uniquement si la checkbox cliquée est cochée ou non. Il faudrait donc modifier cette fonction pour vérifier si au moins une checkbox est cochée (en vérifiant le retour de querySelectorAll('input[name="coche"]:checked') par exemple).
Au passage, tu devrais surement utiliser un tableau pour l'attribut name de tes checkbox si tu veux toutes les récupérer lors du traitement (
Actuellement ta fonction handleChange vérifie uniquement si la checkbox cliquée est cochée ou non. Il faudrait donc modifier cette fonction pour vérifier si au moins une checkbox est cochée (en vérifiant le retour de querySelectorAll('input[name="coche"]:checked') par exemple).
Au passage, tu devrais surement utiliser un tableau pour l'attribut name de tes checkbox si tu veux toutes les récupérer lors du traitement (
<input type="checkbox" name="coche[]" value="...">). Pour l'instant le formulaire ne doit envoyer que la valeur de la dernière checkbox cochée.
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
23 mars 2022 à 20:57
23 mars 2022 à 20:57
Bonsoir Pitet et merci pour ton aide
Je me suis aperçu effectivement que si je n'avais pas un input avec name="coche[]" ça n'allait pas fonctionner...
Du coup j'ai corrigé mon code et voici un truc qui semble fonctionner, en me servant de ta piste et piquant à droite et à gauche :
Je me suis aperçu effectivement que si je n'avais pas un input avec name="coche[]" ça n'allait pas fonctionner...
Du coup j'ai corrigé mon code et voici un truc qui semble fonctionner, en me servant de ta piste et piquant à droite et à gauche :
<table> <thead> <tr> <th><input id='checkAll' type="checkbox" onclick="checkAllBox(this, 'coche');" onchange='handleChange(this);'/></th> <th>N°</th> <th>DATE</th> <th>CLIENT</th> <th>TYPE</th> <th>DÉBUT</th> <th>FIN</th> <th>TOTAL</th> </tr> </thead> <h1>LISTE DES CLIENTS VALIDÉS</h1> <?php $i=1; foreach($contrats1 as $valeur) { $i++;?> <tr> <input type="hidden" name="nombre" value="<?php echo $i;?>"> <td> <input type="checkbox" id="coche" name="coche[]" value="<?php echo $valeur['id_contrat']; ?>" onchange='handleChange(this);'> </td> <td class="td-centre"> <?php echo $valeur['id_contrat']; ?> </td> <td class="td-centre"> <?php echo date("d/m/Y", strtotime($valeur['date_contrat'])); ?> </td> <td class="td-gauche"> <?php echo $valeur['client']; ?> </td> <td class="td-centre"> <?php echo $valeur['batiment']; ?> </td> <td class="td-centre"> <?php echo date("d/m/Y", strtotime($valeur['date_debut'])); ?> </td> <td class="td-centre"> <?php echo date("d/m/Y", strtotime($valeur['date_fin'])); ?> </td> <td class="td-droite"> <?php echo number_format($valeur['total'], 2, ',', ' '); ?> </td> </tr> <?php }?> </table>
<script type="text/javascript"> function checkAllBox(ref, name) { var form = ref; while (form.parentNode && form.nodeName.toLowerCase() != 'form') { form = form.parentNode; } var elements = form.getElementsByTagName('input'); for (var i = 0; i < elements.length; i++) { if (elements[i].type == 'checkbox' && elements[i].id == name) { elements[i].checked = ref.checked; } } } function handleChange(checkbox) { const nodeList = document.querySelectorAll('input[name="coche[]"]:checked') if(nodeList.length >0){ document.getElementById("valid").removeAttribute("disabled"); document.getElementById("valid").className = "btn-forumulaire btn-vert"; }else{ document.getElementById("valid").setAttribute("disabled", "disabled"); document.getElementById("valid").className = "btn-forumulaire btn-vert-disabled"; document.getElementById("checkAll").checked = false; } } </script>
// Connexion à la base de données : require ("connexion.php"); // On récupère les numéros de contrats choisis pour être facturés // Et on remplace leur état facture 1 par 2 : foreach ($_POST['coche'] as $value): if (!empty($value)): $requete = $bdd->prepare('UPDATE contrats SET facture = 2 WHERE id_contrat = :contrat'); $requete->execute(array('contrat' => $value)); endif; endforeach;
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
23 mars 2022 à 20:59
23 mars 2022 à 20:59
Ça te semble correct ?
Pitet
Messages postés
2826
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
21 juillet 2022
525
>
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
Modifié le 24 mars 2022 à 17:10
Modifié le 24 mars 2022 à 17:10
Oui la fonction js handleChange semble correcte, c'était bien l'idée de vérifier si le querySelectorAll des checkbox cochées retourne une liste avec une taille supérieure 0.
Du coup tu peux supprimer le paramètre checkbox dans le nom de la fonction handleChange() puisque celui-ci n'est plus utilisé (il faudra aussi supprimer le this passé en paramètre lors de l'appel à cette fonction dans l'attribut onchange de ton input).
Enfin, au lieu de changer la classe css btn-vert par btn-vert-disabled en js, tu pourrais directement utiliser la pseudo classe css :disabled pour styliser le bouton lorsqu'il possède l'attribut disabled.
Dans ton css, tu pourrais par exemple remplacer la classe .btn-vert-disabled par le sélecteur .btn-vert:disabled, ainsi tu ne devrais pas avoir besoin de changer la classe en js (le style changera si le bouton possède l'attribut disabled).
Du coup tu peux supprimer le paramètre checkbox dans le nom de la fonction handleChange() puisque celui-ci n'est plus utilisé (il faudra aussi supprimer le this passé en paramètre lors de l'appel à cette fonction dans l'attribut onchange de ton input).
Enfin, au lieu de changer la classe css btn-vert par btn-vert-disabled en js, tu pourrais directement utiliser la pseudo classe css :disabled pour styliser le bouton lorsqu'il possède l'attribut disabled.
Dans ton css, tu pourrais par exemple remplacer la classe .btn-vert-disabled par le sélecteur .btn-vert:disabled, ainsi tu ne devrais pas avoir besoin de changer la classe en js (le style changera si le bouton possède l'attribut disabled).
emrh
Messages postés
427
Date d'inscription
mardi 9 décembre 2014
Statut
Membre
Dernière intervention
9 avril 2024
20
24 mars 2022 à 23:27
24 mars 2022 à 23:27
Encore une fois merci pour tous tes bons conseils... je cours les mettre en application !