IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Activer/désactiver des checkbox


Sujet :

JavaScript

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut Activer/désactiver des checkbox
    Bonjour à tous !

    Voici mon souci : il s'agit de traduire un texte d'une langue source vers une ou plusieurs langue cibles.
    La langue source doit être unique, c'est donc une list :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <select name="source"  onChange="activerCibles(this.form, 'cibles[]', this.value)">
    	<option value="francais"<?php if($source =='francais') echo 'selected="selected"';?>> Fran&ccedil;ais</option>
    	<option value="italien"<?php if($source == 'italien') echo 'selected="selected"';?>> Italien</option>
    	<option value="anglais"<?php if($source == 'anglais') echo 'selected="selected"';?>> Anglais</option>
    	<option value="allemand"<?php if($source == 'allemand') echo 'selected="selected"';?>> Allemand</option>
    	<option value="portugais"<?php if($source == 'portugais') echo 'selected="selected"';?>> Portugais</option>
    	<option value="espagnol"<?php if($source == 'espagnol') echo 'selected="selected"';?>> Espagnol</option>
    </select>
    Le test sur la variable php $source est là pour qu'après soumission du formulaire, la valeur sélectionnée elle

    Les langues cibles peuvent être multiples, ce sont donc des checkbox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <label><input type="checkbox" name="cibles[]" value="francais" <?php if(preg_match('/francais/', $liste_cibles)==true) echo 'checked="checked"';?>  onClick="Compter(this.form.nb_mots.value,this.form)"/>Fran&ccedil;ais</label>
    <label><input type="checkbox" name="cibles[]" value="anglais"   <?php if(preg_match('/anglais/', $liste_cibles)==true) echo 'checked="checked"';?> onClick="Compter(this.form.nb_mots.value,this.form)"/>Anglais</label>
    <label><input type="checkbox" name="cibles[]" value="italien"   <?php if(preg_match('/italien/', $liste_cibles)==true) echo 'checked="checked"';?> onClick="Compter(this.form.nb_mots.value,this.form)"/>Italien</label>
    <label><input type="checkbox" name="cibles[]" value="portugais" <?php if(preg_match('/portugais/', $liste_cibles)==true) echo 'checked="checked"';?> onClick="Compter(this.form.nb_mots.value,this.form)"/>Portugais</label>
    <label><input type="checkbox" name="cibles[]" value="espagnol"  <?php if(preg_match('/espagnol/', $liste_cibles)==true) echo 'checked="checked"';?> onClick="Compter(this.form.nb_mots.value,this.form)"/>Espagnol</label>
    <label><input type="checkbox" name="cibles[]" value="allemand"  <?php if(preg_match('/allemand/', $liste_cibles)==true) echo 'checked="checked"';?> onClick="Compter(this.form.nb_mots.value,this.form)"/>Allemand</label>
    La fonction "Compter(this.form.nb_mots.value,this.form)" est une fonction Javascript qui permet de compter le nombre de jours nécessaires à la traduction.

    Cependant il y a plusieurs contraintes :
    - la langue source et la langue cible ne peuvent être identiques. Pour l'instant je fais ce contrôle en php à la validation du formulaire. Mais étant données les contraintes suivantes, je souhaiterais le faire en Javascript.
    - j'ai des combinaisons de langues sources/cibles définies :
    FR vers (it, angl, esp, all, port)
    (it, angl, esp, all, port) vers FR

    Je souhaiterais donc :
    • au tout premier affichage du formulaire, la langue source "francais" est sélectionnée je souhaite donc que dans les langues sources :
      • le francais soit grisé et non sélectionnable
      • les autres langues (it, angl, esp, all, port) sont dipsonibles et cliquables
    • quand on sélectionne le français en langue source :
      • le francais est grisé et non sélectionnable
      • les autres langues (it, angl, esp, all, port) sont dipsonibles et cliquables
    • quand on sélectionne une des langues (it, angl, esp, all, port) en langue source
      • le francais est dipsonibles et cliquables
      • les autres langues (it, angl, esp, all, port) sont grisés et non sélectionnables

    J'avais fait un test avec la fonction "activerCibles(this.form, 'cibles[]', this.value)" que vous voyez sur le onChange de ma liste, mais sans succès.

    Voici le détail de cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     function activerCibles(form,inputName,source) {
    	switch (source) { 
    		case 'francais': 
    			form.cibles['francais'].disabled='true';
    			form.cibles['italien'].disabled='false';
    			form.cibles['anglais'].disabled='false';
    			form.cibles['espagnol'].disabled='false';
    			form.cibles['allemand'].disabled='false';
    			form.cibles['portugais'].disabled='false';
    			break; 
    		case 'italien': 
    		case 'anglais': 
    		case 'espagnol':
    		case 'allemand': 	
    		case 'portugais': 
    			form.cibles['francais'].disabled='false';
    			form.cibles['italien'].disabled='true';
    			form.cibles['anglais'].disabled='true';
    			form.cibles['espagnol'].disabled='true';
    			form.cibles['allemand'].disabled='true';
    			form.cibles['portugais'].disabled='true';
    			break;
    	}
    	var inputs = form.elements[inputName];
     
    	for (var i = 0; i < inputs.length; i++) {
    		var input = inputs;
    		alert(input.value);
    			if (input.value == source) {
    				input.disabled = true;
    				input.checked = true;
    			}
    			else {
    				input.disabled = false;
    			}
    	}
    }
    Pourriez-vous m'aider ?


    Merci beaucoup

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Pour préciser, lorsque je sélectionne une valeur dans la liste de langues sources, j'obtiens l'erreur suivante :

    " 'cibles.francais' a la valeur Null ou n'est pas un objet "

    Cette erreur est déclenchée par la ligne suivante du switch/case de la fonction activerCibles() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form.cibles['francais'].disabled='false';

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    form.cibles['francais'].disabled='false';
    la propriété disabled est un booléen, mais tu lui passes une chaine
    Ceci dit, form fait partie du langage, l'utiliser comme nom de variable, de champ ou autre est plus que déconseillé !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Merci Bovino.

    J'ai corrigé le nom du formulaire et les booléens de cette manière (je ne mets qu'une ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function activerCibles(formulaire,inputName,source) {
     
    [...]
     
    formulaire.cibles['francais'].disabled=false;
     
    [...]
     
    }
    mais cela ne change rien, j'ai toujours le même message d'erreur : 'cibles.francais' a la valeur Null ou n'est pas un objet

  5. #5
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function activerCibles(formulaire,source) {
    	var disabl = false;
    	if(source=='francais'){
    		disabl = true;
    	}
    	for(var i=0; i<formulaire.elements['cibles[]'].length;i++){
    		if(formulaire.elements['cibles[]'][i].value=='francais'){
    			formulaire.elements['cibles[]'][i].disabled=disabl;
    		}else{
    			formulaire.elements['cibles[]'][i].disabled= (!disabl);
    		}
    	}
    }
    A+.

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var inputs = form.elements[inputName];
    Donc inputs est une collection d'objets HTML.
    input (nom pas terrible non plus ) est donc aussi une collection
    une collection n'a pas de value !

    En fait, tu as juste oublié de préciser le rang de l'input :
    Et au passage, déclarer une variable dans une boucle n'est pas très propre, il est préférable de la déclarer en début de fonction
    puis juste de faire des affectations dans la boucle
    Mais bon, la solution d'andry est pas mal

  7. #7
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    @Bovino
    J'ai pas compris pourquoi tu racontes des histoires d'input et inputs . /me s'est aussi demandé à quoi ça sert la variable inputName . Maintenant je comprend pourquoi la fonction que j'ai proposé n'est pas complète .

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Merci à vous 2 Bovina et andry ça marche bien maintenant !

    j'ai ajouté une ligne, pour être sûr que quand la checkbox est désactivée elle n'est pas non plus cochée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(formulaire.elements['cibles[]'][i].value=='francais'){
    	formulaire.elements['cibles[]'][i].disabled = disabl;
    	formulaire.elements['cibles[]'][i].checked = (!disabl);
    }
    Il faut maintenant que je vois comment faire pour qu'au chargement de la page (français déjà sélectionné), cela fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <body onload="activerCibles('document.forms[0]', 'francais');">
    Car à ce moment là, il ne connait pas le tableau de cibles formulaire.elements['cibles[]']

    En plus, quand je poste mon formulaire je change de page php qui contient le body

  9. #9
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par babylone7
    Merci à vous 2 Bovina
    Ma femme n'a rien à voir avec la solution à ton problème

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par Bovino Voir le message
    Ma femme n'a rien à voir avec la solution à ton problème
    loooool !! désolée Bovino

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Pour l'affichage au chargement de la page, j'ai réussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <body onload="init();">
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function init() {
    	var disabl = true;
    	for(var i=0; i<document.forms[0].elements['cibles[]'].length;i++){
    		if(document.forms[0].elements['cibles[]'][i].value=='francais'){
    			document.forms[0].elements['cibles[]'][i].disabled = disabl;
    			document.forms[0].elements['cibles[]'][i].checked = (!disabl);
    		}else{
    			document.forms[0].elements['cibles[]'][i].disabled = (!disabl);
    		}
    	}
    }
    Par contre je poste mon formulaire vers une autre page php qui comporte des traitements (vérification de la conformité des champs, nullité etc) et qui réaffiche le formulaire tel que pré-rempli (avec les checkbox cochées etc).

    Et là, si par exemple je sélectionne source = allemand et que je coche cible = francais, à la soumission du formulaire, j'ai bien francais qui est toujours coché mais les autre langues ne sont plus grisées
    si je rappelle la fonction init() ça va tout me vider non ?..

  12. #12
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Tu peux le gérer facilement coté serveur (php) .
    Fait une recherche sur la php, il y a un bout de code que tu peux facilement adapter .


  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    Tu peux le gérer facilement coté serveur (php) .
    Fait une recherche sur la php, il y a un bout de code que tu peux facilement adapter .


    Gérer toute la problématique des checkbox ou juste l'appel de la fonction init() ?
    Vais aller voir ça merci andry

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Je crois que j'ai réussi !!!

    Sur tes conseils, j'ai vu dans la FAQ PHP comment appeler du php dans le javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <body onload="onLoadActiverCibles(document.forms[0],'<?php echo $source;?>','<?php echo $alerte; ?>');">
    le paramètre $alerte est une variable affectée quand le formulaire est soumis, c'est ce qui me permet de réafficher les champs remplis avant la soumission.

    Et du coup, quand le formulaire est posté, je ne réinitialise pas les cibles comme au 1ere chargement, je gère juste le paramètre disabled et je laisse le traitement php gérer le paramètre checked :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function onLoadActiverCibles(formulaire,source,alerte) {
    	var disabl = false;
    	if(source=='francais'){
    		disabl = true;
    	}
    	for(var i=0; i<formulaire.elements['cibles[]'].length;i++){
    		if(formulaire.elements['cibles[]'][i].value=='francais'){
    			formulaire.elements['cibles[]'][i].disabled = disabl;
    		}else{
    			formulaire.elements['cibles[]'][i].disabled = (!disabl);
    		}
    	}
    	Compter(document.forms[0].nb_jours.value,document.forms[0]);
    }
    Et ça marche bien

    En fin j'espère du moins ! On n'est jamais à l'abri de découvrir qu'on a mal tester son truc !

    Merci beaucoup Andry !!!!

  15. #15
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par babylone7 Voir le message
    En fin j'espère du moins ! On n'est jamais à l'abri de découvrir qu'on a mal tester son truc !
    T'en faits pas, les meilleurs testeurs sont les utilisateurs finaux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Activer/désactiver des fonctionnalités
    Par pdfmaker dans le forum Général Java
    Réponses: 3
    Dernier message: 10/06/2009, 11h33
  2. Activer/désactiver des fonctionnalités
    Par pdfmaker dans le forum Architecture
    Réponses: 1
    Dernier message: 28/03/2009, 13h53
  3. Activation - désactivation des macros
    Par olivepao dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/07/2008, 12h55
  4. Activer / désactiver des périphériques
    Par adage2000 dans le forum MFC
    Réponses: 3
    Dernier message: 28/04/2005, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo