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 :

Choisir le bon événement sur le bon élément


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Choisir le bon événement sur le bon élément
    Bonjour,
    Je veux limiter la modification d'un champ de formulaire à un seul champ à la fois. Tous mes champs de formulaire sont en disabled ou readonly.
    Quand je double-clique sur un champ j'autorise sa modification. Jusque là tout va bien. Par contre, je ne sais pas comment remettre la propriété readonly lorsque j'ai traité la modification.
    Code Javascript : 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
    "use strict";
     
    const
    	inclForm	= window.document.querySelector('.displCard'),
    	fields		= window.document.querySelectorAll('.displCard input, .displCard textarea');
     
    // Modification des champs
    inclForm.addEventListener('dblclick', function(e) // Fonctionne
    {
    	e.target.removeAttribute('disabled');
    	e.target.removeAttribute('readonly');
    }, false );
     
    inclForm.addEventListener('blur', function(e) // N'est jamais appelée
    {
    	alert(e.target.name);
    	alert('xxx');
    	//inclForm.submit();
    	e.target.setAttribute('readonly', '');
    }, false );

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ben pour le remettre tu as l'air de déjà connaitre setAttribute(), non ?


    EDIT : Ah oui la fonction n'est pas exécutée car cela concerne la form et non l'élément sur lequel tu as fait un double-clique...

    Pour la délégation d'événement concernant cet événement regarde ça : https://developer.mozilla.org/fr/doc...9v%C3%A9nement (j'ai testé l'exemple ici : https://jsbin.com/xukebajiqu/edit?js,output)...

    ---> Essaye en remplaçant "false" par "true" dans ton deuxième inclForm.addEventListener...

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Merci beaucoup. J'ai essayé et tout fonctionne comme je le souhaite.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    J'ai réagis trop tôt: tout ne fonctionne pas!
    Les lignes 14 et 26 à 28 posent un problème. Voir les commentaires.
    Code javascript : 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
    const
    	inclForm	= window.document.querySelector('.displCard'),
    	fields		= window.document.querySelectorAll('.displCard input, .displCard textarea');
     
    // Modification des champs
    var field;
     
    inclForm.addEventListener('dblclick', function(e)
    {
    	field = e.target;
    	field.removeAttribute('readonly');
    	// Sans la ligne suivante, je suis obligé de re-cliquer sur le champ
    	// Avec la ligne, je passe directement à la page 'editField.php'
    	field.select(); // sans cette ligne, je suis obligé de 
    }, false );
     
    inclForm.addEventListener('blur', function(e)
    {
    	//if ( typeof field == 'undefined' ) { return false; }
    	//if ( typeof field != 'undefined' ) {
    	for (let i=0, max=fields.length; i<max; i++)
    	{
    		if (e.target == field) { continue; }
    		e.target.setAttribute('readonly', '');
    	}
    	if ( typeof field == 'undefined' ) return false; // Sans cette ligne, le fonctionnement se rapproche de ce que je souhaite mais j'obtiens une erreur "référence nulle ou non définie"
    	inclForm.action = 'editField.php?field='+field.name;
    	inclForm.submit();
    	//}
    }, true );

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Je ne sais pas exactement ce que tu veux faire* mais pourquoi tu utilises une boucle puisque tu utilises une variable globale "field" ?

    Essaye de faire juste ça : field.setAttribute('readonly', ''); puisque juste avant (dans le inclForm.addEventListener('dblclick',...) tu as fait field = e.target;... Éventuellement juste avant assure toi que field n'est pas indéfini...

    En plus tu mets if (e.target == field) { continue; } juste avant e.target.setAttribute('readonly', ''); donc en cas d’égalité cette dernière ligne n'est pas exécutée or l'exécuter en cas d'égalité c'est justement ce que tu veux, non ?

    ---> L'instruction continue te fait passer directement à la boucle suivante du coup les instructions qui la suivent ne sont pas exécutées...

    Autre chose : tu n'utilises pas l'indice "i" ni la liste "fields" peut-être que tu voulais écrire if (e.target == fields[i]) {... à la place de if (e.target == field) {... ? Mais même comme ça je ne comprends pas mais peut-être que tu voulais faire un truc comme ça : if (e.target != fields[i]) {......




    * Peux-tu nous donner un exemple de code HTML ?

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    Je reprends du départ.
    J'ai un formulaire dont par défaut tous les champs ont un attribut readonly. Je veux pouvoir modifier un seul champ à la fois lorsque je clique 2 fois dessus. C'est le même principe que dans phpMyAdmin en mode affichage ou parcourir.
    La procédure est la suivante:
    1-Je clique deux fois sur le champ à modifier,
    2-Je modifie la valeur du champ,
    3-Lorsque je clique hors du champ, j'envoie le formulaire.

    Voici mon code modifié:
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    inclForm.addEventListener('blur', function(e)
    {
    	if ( typeof field != 'undefined' ) {
    		for (let i=0, max=fields.length; i<max; i++)
    		{
    			if (e.target == field) { continue; }
    			fields[i].setAttribute('readonly', '');
    		}
    	inclForm.action = 'editField.php?field='+field.name;
    	//inclForm.submit();
    	}
    }, true );
    J'ai aussi testé la variante suivante qui n'est jamais exécutée.
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if ( typeof field != 'undefined' )
    {
    	field.addEventListener('blur', function(e)
    	{
    		for (let i=0, max=fields.length; i<max; i++)
    		{
    			if (e.target == field) { continue; }
    			fields[i].setAttribute('readonly', '');
    		}
    	}, false );
    }

    L'instruction 'continue' est bien volontaire, par contre j'ai bien une erreur dans ma boucle for. Il faut remplacer e.target.setAttribute par fields[i].setAttribute.
    Malgré ces modifications mon code ne marche pas :
    - Voir les commentaires en lignes 12 et 13,
    - Si je clique sur une zone de texte ou sur un emplacement vide, l'attribut readonly n'est pas attribué au champ qui vient d'être modifié. Par contre, il l'est si je clique sur un champ de type input.

    Exemple de code html
    Code html : 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
    <form method="post" action="" class="L displCard">
    	<div class="multiCols">
    		<div class="div1">
    			<strong><label><?= INCL_LBL_FIRST; ?></label><input type="text" name="prenom" value="<?= $address->prenom; ?>" readonly /></strong><br/>
    			<p></p>
    			<label><?= INCL_LBL_ADDR; ?></label><textarea name="adresse" cols="30" rows="3" readonly><?= $address->adresse; ?></textarea><br/>
    			<label><?= INCL_LBL_COUNTRY; ?></label><input type="text" name="pays" value="<?= $address->pays; ?>" readonly /><br/>
    			<label><?= INCL_LBL_CP; ?></label><input type="text" name="cp" value="<?= $address->cp; ?>" readonly /><br/>
    			<label><?= INCL_LBL_LOCALITY; ?></label><input type="text" name="ville" value="<?= $address->ville; ?>" readonly /><br/>
    		</div>
    		<div class="div2">
    			<strong><label><?= INCL_LBL_LAST; ?></label><input type="text" name="nom" value="<?= $address->nom; ?>" readonly /></strong><br/>
    			<p></p>
    			<label><?= INCL_LBL_HOME; ?></label><input type="text" name="tel_domicile" value="<?= $address->tel_domicile; ?>" readonly /><br/>
    			<label><?= INCL_LBL_GSM; ?></label><input type="text" name="tel_portable" value="<?= $address->tel_portable; ?>" readonly /><br/>
    			<label><?= INCL_LBL_WORK; ?></label><input type="text" name="tel_travail" value="<?= $address->tel_travail; ?>" readonly /><br/>
    			<label><?= mailtoLbl($address->courriel); ?></label><input type="text" name="courriel" value="<?= $address->courriel; ?>" readonly /><br/>
    		</div>
    	</div>
    	<div style="margin-top:10px;margin-left:20px;">
    		<label><?= INCL_LBL_NOTES; ?></label><textarea name="notes" style="width:500px" readonly><?= $address->notes; ?></textarea><br/>
    		<label><?= INCL_LBL_UPDATE; ?></label><input type="text" name="update_date" value="<?= $address->update_date; ?>" readonly /><br/>
    	</div>
    </form>

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

Discussions similaires

  1. Plusieurs évènements sur le même élément
    Par Quentique dans le forum jQuery
    Réponses: 4
    Dernier message: 09/08/2015, 08h02
  2. Réponses: 2
    Dernier message: 06/12/2013, 11h29
  3. Deux événements sur le même élément HTML
    Par ultraxa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 25/10/2012, 17h31
  4. Réponses: 3
    Dernier message: 21/07/2011, 00h32
  5. Réponses: 3
    Dernier message: 09/06/2006, 14h49

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