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 :

Remplacement d'un champ input par une liste d'options selon l'état de l'attribut readonly


Sujet :

JavaScript

  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 Remplacement d'un champ input par une liste d'options selon l'état de l'attribut readonly
    Bonjour à tous.
    Les listes d'options ne prennent pas en compte l'attribut readonly. Je veux donc afficher un champ input avec l'attribut readonly et le remplacer par une liste d'options en l'absence de cet attribut. Parce que je ne vois pas comment traiter la liste d'options comme le reste.
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <label>Pays</label><span id="country"><input type="text" name="pays" value="<?= $address->pays; ?>" readonly /></span><br/>
    Dans le code qui suit la fonction listOnBlur n'est pas appelée. Pourquoi?
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    "use strict";
     
    const
    	inclForm	= window.document.querySelector('.displCard')
    	, fields		= window.document.querySelectorAll('.displCard [readonly]')
    	, country		= window.document.querySelector('.displCard #country');
     
    function handleOnDblClick() {
    	if ( this.name == 'pays' ) {
    		country.innerHTML = fromPHPtoJS.lstCountries;
    	}
    	this.removeAttribute('readonly');
    	this.select();
    }
     
    function handleOnBlur() {
    	this.setAttribute('readonly', 'readonly');
    	inclForm.action = 'editField.php?field='+this.name;
    	inclForm.submit();
    }
     
    function handleKeyDown(e) {
    	if ( e.keyCode == 8 && this.hasAttribute('readonly') ) { e.preventDefault(); }
    }
     
    function listOnDblClick(e) {
    	this.innerHTML = fromPHPtoJS.lstCountries; // Contient la liste d'options complète
    }
     
    // Pourquoi cette fonction n'est jamais utilisée ??
    function listOnBlur() {
    	console.log(fields[2]);
    	alert('fonction listOnBlur');
    	fields[2].value = this.firstChild.selectedIndex;
    	this.innerHTML = fields[2];
    	//inclForm.preventDefault(); // Pour mise au point
    	inclForm.submit(); // Après mise au point
    }
     
    country.ondblclick	= listOnDblClick;
    country.onblur		= listOnBlur;
    for (let i=0, max=fields.length; i<max; i++) {
    	fields[i].ondblclick	= handleOnDblClick;
    	if ( i != 2 ) { fields[i].onblur = handleOnBlur; }
    	fields[i].onkeydown		= handleKeyDown;
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    j'ai traité la question ce matin dans cette discussion.

    Une solution consiste à désactiver les options non sélectionnées.

    Code JavaScript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      var allSelectOptions = document.querySelectorAll("select option");
      allSelectOptions.forEach(function(seloption) {
        if (!seloption.selected) { // on desactive les options non selectionnees
          seloption.disabled = true;
        }

  3. #3
    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
    Salut,

    Je n'ai pas encore regardé le reste mais justement récemment jreaux62 a donné une solution par rapport au premier problème : #3

    EDIT : Ah quand j'ai commencé à répondre jreaux62 n'avait pas encore répondu et avant que je poste quelqu'un est venu discuter avec moi...

  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
    Avec IE11, j'ai une erreur à la ligne 4 de ton code: "L'objet ne gère pas la propriété ou la méthode "foreach".
    J'ai vérifié sur MDN et cette méthode est supportée à partir de la version 9.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Alors utilise la syntaxe donnée par Beginner. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                for (var i = 0, l = allInput.length; i < l; i++) {
                    allInput[i].readOnly = true;
                }

  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
    C'est déjà ce que j'avais fait mais je voulais comprendre pourquoi. J'ai fait quelques recherches et il semblerait que cette méthode ne fonctionne pas avec des listes de nœuds du DOM mais je n'ai pas très bien compris pourquoi.

  7. #7
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 198
    Par défaut
    Bonjour,
    J'ai vérifié sur MDN et cette méthode est supportée à partir de la version 9.
    oui lorsqu'il s'agit d'une méthode appliquée aux Array, Array.prototype, or là tu travailles sur une NodeList, qui n'est pas un Array, et cette méthode n'est pas implémentée dans IE.


  8. #8
    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
    Il y a 3 semaines que je galère sur ce bout de script de quelques lignes et je n'en peux plus. Je ne sais plus comment traiter le problème! Autant je m'en sors à peu près avec PHP, autant j'ai de grosses difficultés avec JavaScript dont je n'arrive pas à comprendre la logique, principalement en ce qui concerne la chronologie des événements et du code.
    Le problème des inputs est résolu. Il me reste le problème de la touche 'enter' et surtout celui de la liste d'options (Si l'action de la touche 'enter' n'a pas de solution, ce n'est pas trop grave).
    En m'inspirant de la solution de jreaux62:
    1. Au chargement du document, je voudrais remplacer toutes les options par une seule, celle qui est sélectionnée par défaut.
    2. Sur double clic, la liste doit faire apparaître toutes les options.
    3. Sur clic extérieur (blur) ou touche 'enter', j'envoie le formulaire avec l'option l'option sélectionnée (comme avec handleOnBlur pour les champs input).

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    "use strict";
     
    //const
    var
    	inclForm			= document.querySelector('.displCard')
    	, inputs			= document.querySelectorAll('.displCard input, .displCard textarea')
    	, countriesList		= document.querySelector('.displCard select[name="pays"]')
    	, countriesOptions	= countriesList.options
    	, countrySelected	= countriesList.options[countriesList.selectedIndex]
    	;
    console.log('a',countriesList);		// Liste avec seulement l'option sélectionnée. Pourquoi n'est-elle pas complète avec toutes les options
    console.log('b',countriesOptions);	// J'ai exactement la même chose qu'en 'a'. Pourquoi je n'ai pas que l'option?
    console.log('c',countriesList.options); // J'ai exactement la même chose qu'en 'b'.
    console.log('d',countrySelected);	// Affichage attendu = option sélectionnée
     
     
    // Modification des champs
    // #######################
     
    function initCountriesList() {
    	console.log(1,countriesList); // Pourquoi comme en 'a', la liste ne contient que l'option sélectionnée? Sans appel à ce script, elle s'affiche entièrement.
    	countriesList.innerHTML = '';
    	console.log(2,countriesList); // Normal: liste vide
    	countriesList.appendChild(countrySelected);
    	console.log(3,countriesList); // Option sélectionnée mais sans le texte ente les balises d'ouverture et de fermeture de l'option
    }
     
    // Donne une liste vide
    window.onload = function(){ 
        initCountriesList();
    }
    /*
    // Donne une liste vide
    document.addEventListener('DOMContentLoaded', function(e) {
    	initCountriesList();
    }, false );
    */
     
    // La suite fonctionn sauf la condition keyCode = 13. Les modifications du champ ne sont pas prises en compte
    function handleOnDblClick() {
    	this.readOnly = false;
    	this.select();
    }
     
    function handleOnBlur() {
    	this.readOnly = true;
    	inclForm.action = 'editField.php?field='+this.name;
    	inclForm.submit();
    }
     
    function handleKeyDown(e) {
    	if ( e.keyCode == 8 && this.hasAttribute('readonly') ) { e.preventDefault(); }
    	if ( e.keyCode == 13 && this.type != 'textarea' ) { inclForm.submit(); }
    }
     
    for (let i=0, max=inputs.length; i<max; i++) {
    	inputs[i].ondblclick	= handleOnDblClick;
    	inputs[i].onblur		= handleOnBlur;
    	inputs[i].onkeydown		= handleKeyDown;
    }

  9. #9
    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
    Salut,

    Ben c'est difficile d'aider car on n'a pas tout, dans les commentaires tu nous listes les problèmes que tu rencontres mais on ne peut pas tester, on ne peut pas les reproduire car tu nous ne donnes pas le html qui va avec le code JS, celui avec lequel tu fais tes testes... Alors on peut deviner une partie mais ce serait plus simple si tu nous donnais le html...

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Donne aussi PLUS d'explications...


    Citation Envoyé par moimp Voir le message
    Au chargement du document, je voudrais remplacer toutes les options par une seule, celle qui est sélectionnée par défaut.
    Ça, je t'ai donné le code pour le faire pour "désactiver" les options non sélectionnées.

    Par contre, si tu veux :
    • afficher d'abord un <input> en readonly,
    • puis au "clic", afficher le <select>,

    il n'y a rien de compliqué là-dedans ( : "afficher/masquer des div au clic").


    Sur double clic, la liste doit faire apparaître toutes les options.
    Déjà qu'on a du mal à obtenir "1 clic" des internautes, mais leur demander un "double-clic", tu rêves...

    Explique-nous pour quoi faire ?
    • pouvoir modifier l'option sélectionnée ?
    • ou juste "voir" les autres options, SANS pouvoir modifier ?



    Sur clic extérieur (blur) ou touche 'enter', j'envoie le formulaire avec l'option l'option sélectionnée (comme avec handleOnBlur pour les champs input).
    • Comment ça, "tu envoies" ?
    • Quel est l'intérêt de ce formulaire ? (quelles champs sont modifiables ??)

  11. #11
    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
    Tu pourrais nous donner juste un exemple de code html pas forcément complet, un aperçu...

    Cela dit :

    Citation Envoyé par moimp Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
        inclForm            = document.querySelector('.displCard')
        , inputs            = document.querySelectorAll('.displCard input, .displCard textarea')
        , countriesList        = document.querySelector('.displCard select[name="pays"]')
        , countriesOptions    = countriesList.options
        , countrySelected    = countriesList.options[countriesList.selectedIndex]
        ;
    console.log('a',countriesList);        // Liste avec seulement l'option sélectionnée. Pourquoi n'est-elle pas complète avec toutes les options
    console.log('b',countriesOptions);    // J'ai exactement la même chose qu'en 'a'. Pourquoi je n'ai pas que l'option?
    console.log('c',countriesList.options); // J'ai exactement la même chose qu'en 'b'.
    1- "J'ai exactement la même chose qu'en 'b'."
    pour c tu affiches countriesList.options
    pour b tu affiches countriesOptions mais on a countriesOptions = countriesList.options

    donc b et c affiche la même chose, c'est normal.

    2- "J'ai exactement la même chose qu'en 'a'. Pourquoi je n'ai pas que l'option?"

    a et b ce n'est pas exactement la même chose, regarde :

    Nom : console.PNG
Affichages : 123
Taille : 12,8 Ko

    countriesList ---> c'est l’élément select
    countriesOptions = countriesList.options ---> c'est la liste des options, c'est une HTMLOptionsCollection...

  12. #12
    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 vous envoie le code source html simplifié. Là je pars en réunion, je traiterai le détail de vos remarques et de vos questions demain.
    Remarque: La ligne 71 du code n'est pas utilisée pour l'instant mais elle est prévue pour charger si nécessaire la liste complète ou la liste à option unique avec un simple innerHTML.
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8" />
     
    	<meta http-equiv="Pragma" content="no-cache" />
    	<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    	<meta http-equiv="Expires" content="-1" />
     
    	<base href="http://omnes.proginet.local/" />
     
    	<link rel="stylesheet" media="all" type="text/css" href="css/structure.css" /> <!-- Dimensions et positions -->
    	<link rel="stylesheet" media="screen" type="text/css" href="css/style0.css" /> <!-- Apparence -->
    	<link rel="stylesheet" type="text/css" href="css/default_blue.css" /> <!-- Calendrier -->
    </head>
     
    <body>
     
    	<section id="main">
    		<div id="left">
    			<nav class="mainNav">
    				<ul>
    	<li><a href="parentPage.php?childPageKey=0">Accueil</a></li>
    	<li><a href="parentPage.php?childPageKey=2">Liste</a></li>
    	<li><a href="parentPage.php?childPageKey=3">Fiche</a></li>
    </ul>			</nav>
    		</div>
    		<article id="right">
     
     
     
    <h2>Fiche individuelle</h2>
    <h3>Ludovic <br/>(Nathalie)</h3>
    <div class="menuH">
    	<ul>
    		<a href='parentPage.php?childPageKey=3&tab=0'><li class='activTab'>Adresse</li></a><a href='parentPage.php?childPageKey=3&tab=1'><li>Famille</li></a><a href='parentPage.php?childPageKey=3&tab=2'><li>Groupes</li></a>	</ul>
    </div>
     
    <div class="subPage">
     
    <form method="post" action="" class="L displCard">
    	<input type="hidden" name="table" value="dat_addresses" />
    	<input type="hidden" name="id" value="120" />
    	<div class="multiCols">
    		<div class="div1">
    			<strong><label>Prénom</label><input type="text" name="prenom" value="Ludovic" readonly /></strong><br/>
    			<p></p>
    			<label>Adresse</label><textarea name="adresse" cols="30" rows="3" readonly ></textarea><br/>
    			<!-- <label>Pays</label><span id="country"><input type="text" name="pays" value="France" /></span><br/> -->
    			<label>Pays</label><select name="pays" id="pays"><option></option><option value="AF">Afghanistan</option><option value="FR" selected="selected">France</option><option value="ZW">Zimbabwe</option></select><br/>
    			<label>Code postal</label><input type="text" name="cp" value="01160" readonly /><br/>
    			<label>Ville</label><input type="text" name="ville" value="Saint Martin du Mont" readonly /><br/>
    		</div>
    		<div class="div2">
    			<strong><label>Nom</label><input type="text" name="nom" value="" readonly /></strong><br/>
    			<p></p>
    			<label>Tél. domicile</label><input type="text" name="tel_domicile" value="0474355680" readonly /><br/>
    			<label>Tél. portable</label><input type="text" name="tel_portable" value="0601757303" readonly /><br/>
    			<label>Tél. travail</label><input type="text" name="tel_travail" value="" readonly /><br/>
    			<label>Courriel</label><input type="text" name="courriel" value="" readonly /><br/>
    			<label>Date de naissance</label><input type="text" name="naissance" value="" readonly /><br/>
    		</div>
    	</div>
    	<div style="margin-top:10px;margin-left:20px;">
    		<label>Notes</label><textarea name="notes" style="width:500px" readonly></textarea><br/>
    		<label>Mise à jour le</label><input type="text" name="update_date" value="05/02/2019" readonly /><br/>
    	</div>
    </form>
     
    <script>
            var fromPHPtoJS = {"lstCountries":"<select name=\"pays\" id=\"pays\"><option><\/option><option value=\"AF\">Afghanistan<\/option><option value=\"FR\" selected=\"selected\">France<\/option><option value=\"ZW\">Zimbabwe<\/option><\/select>","countryShortOption":"<option value='FR'>France<\/option>"};
    </script>
    </div>
    		</article>
    	</section>
    	<script src='displCard.js'></script>
    </body>
     
    </html>

  13. #13
    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
    En fait, même si grâce à vous, je suis assez fier de m'en être sorti. Il me reste encore la gestion de la touche 'enter' (keyCode = 13) à régler: Les modifications ne sont pas prises en compte.
    Voici les modifications de mon code html:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <label>Pays</label><input type="text" name="pays" value="France" readonly /><!--
    --><select name="pays" id="pays"><option></option><option value="AF">Afghanistan</option><option value="FR" selected="selected">France</option><option value="ZW">Zimbabwe</option></select><br/>
    et le code JavaScript actuel:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    "use strict";
     
    const
    	, inclForm		= document.querySelector('.displCard')
    	, inputs		= document.querySelectorAll('.displCard input:not([name=\'pays\']), .displCard textarea')
    	, countriesList	= document.querySelector('.displCard select[name="pays"]')
    	, countryInput	= document.querySelector('.displCard input[name=\'pays\']')
    	;
     
    function countryOnWindowLoad() {
    	countriesList.classList.add('hidden');
    }
     
    function countryOnDblClick() {
    	countryInput.classList.add('hidden');
    	countriesList.classList.remove('hidden');
    }
     
    function countriesOnBlur() {
    	this.classList.add('hidden');
    	countryInput.classList.remove('hidden');
    	inclForm.action = 'editField.php?field='+this.name;
    	inclForm.submit();
    }
     
    window.onload = function(){ 
        countryOnWindowLoad();
    }
     
    countryInput.ondblclick	= countryOnDblClick;
    countriesList.onblur	= countriesOnBlur;
     
    function handleOnDblClick() {
    	this.readOnly = false;
    	this.select();
    }
     
    function handleOnBlur() {
    	this.readOnly = true;
    	inclForm.action = 'editField.php?field='+this.name;
    	inclForm.submit();
    }
     
    function handleKeyDown(e) {
    	if ( e.keyCode == 8 && this.hasAttribute('readonly') ) { e.preventDefault(); }
    	if ( e.keyCode == 13 && this.type != 'textarea' ) { inclForm.submit(); }
    }
     
    for (let i=0, max=inputs.length; i<max; i++) {
    	inputs[i].ondblclick	= handleOnDblClick;
    	inputs[i].onblur		= handleOnBlur;
    	inputs[i].onkeydown		= handleKeyDown;
    }
    EDIT:
    Je rencontre un autre problème: J'utilise ce script sur d'autres formulaires. Si ceux-ci n'ont pas de liste d'options, j'obtiens une erreur "référence nulle ou non définie". J'ai donc encadrer la partie de code concernée dans une condition if ( typeof countriesList && typeof countryInput ) mais ceci n'empêche pas l'erreur.

  14. #14
    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 tu n'as pas répondu aux questions de jreaux62, c'est pour mieux comprendre...





    Citation Envoyé par moimp Voir le message
    Il me reste encore la gestion de la touche 'enter' (keyCode = 13) à régler: Les modifications ne sont pas prises en compte.
    Qu'est-ce qui ne vas pas avec ce point ?

    La touche "enter" n'a-t-elle pas déjà le comportement que tu veux (envoyer le formulaire) ?

    Si son comportement par défaut ne te convient pas alors il faut que tu l’empêches comme pour la touche backspace...


    Citation Envoyé par moimp Voir le message
    EDIT:
    Je rencontre un autre problème: J'utilise ce script sur d'autres formulaires. Si ceux-ci n'ont pas de liste d'options, j'obtiens une erreur "référence nulle ou non définie". J'ai donc encadrer la partie de code concernée dans une condition if ( typeof countriesList && typeof countryInput ) mais ceci n'empêche pas l'erreur.
    Je ne vois pas cette condition dans ton code ???

  15. #15
    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
    Citation Envoyé par Beginner. Voir le message
    Ben tu n'as pas répondu aux questions de jreaux62, c'est pour mieux comprendre...
    Je n'étais pas clair avec moi-même. Entre temps, j'ai avancé tout seul et j'ai résolu le plus dur.

    Citation Envoyé par Beginner. Voir le message
    Qu'est-ce qui ne vas pas avec ce point ?
    La touche "enter" n'a-t-elle pas déjà le comportement que tu veux (envoyer le formulaire) ?
    Je n'ai pas été assez clair. En effet, je veux envoyer le formulaire mais après prise en compte des modifications et non pas avant, comme avec handleOnBlur. En répondant à ta question, j'ai résolu le problème, il manquait la ligne inclForm.action = 'editField.php?field='+this.name;

    Citation Envoyé par Beginner. Voir le message
    Je ne vois pas cette condition dans ton code ???
    Oui, parce que j'ai fait cette correction après. Elle encadre les lignes 10 à 31.

  16. #16
    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
    Bonjour,

    J'ai trouvé une solution qui n'est peut-être pas la plus élégante. J'ai scindé mon fichier de script en deux et je n'appelle que ceux qui son nécessaires. Mon problème est donc résolu. Merci à vous. Vous m'avez bien aidé, déjà au moins en me faisant poser les bonnes questions.

  17. #17
    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
    Contrairement à ce que je croyais, mon problème n'est pas complètement résolu. Cette partie de code me pose un problème lorsque le champ pays n'est pas renseigné. Je ne sais pas comment tester et prendre en compte la valeur null des variables countriesList et countryInput lorsqu'elle sont vides dans le formulaire. C'est la condition dont je parlais et qui encadre maintenant la totalité du script.
    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
    if ( typeof countriesList && typeof countryInput ) {
    	function countryOnWindowLoad() {
    		countriesList.classList.add('hidden');
    	}
     
    	function countryOnDblClick() {
    		countryInput.classList.add('hidden');
    		countriesList.classList.remove('hidden');
    	}
     
    	function countriesOnBlur() {
    		this.classList.add('hidden');
    		countryInput.classList.remove('hidden');
    		inclForm.action = 'editField.php?field='+this.name;
    		inclForm.submit();
    	}
     
    	window.onload = function(){
    		countryOnWindowLoad();
    	}
     
    	countryInput.ondblclick	= countryOnDblClick;
    	countriesList.onblur	= countriesOnBlur;
    }

  18. #18
    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
    Cette condition n'est pas correcte : si par exemple on a countriesList == null alors typeof countriesList renvoi "object" (c'est une string) et non null.

    Essaye en remplaçant if (typeof countriesList && typeof countryInput) par if (countriesList == null && countryInput == null) ou simplement par if (countriesList && countryInput)...


    ---> Après es-tu sûr que tu veux utiliser un "et logique" (&&) ? Parce que si par exemple on a countriesList == null alors (countriesList == null && countryInput == null) (ou (countriesList && countryInput)) renverra false même si countryInput n'est pas égale à null...

    Peut-être que c'est un "ou logique" (||) que tu veux, non ?

  19. #19
    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
    Cette condition n'est pas correcte : si par exemple on a countriesList == null alors typeof countriesList renvoi "object" (c'est une string) et non null.
    Ah, d'accord je n'avais pas compris cette subtilité.

    Il me semble que c'est soit if (countriesList && countryInput) soit if ( !(countriesList == null || countryInput == null) ) pour exécuter le code. Il faut que les deux variables soient valides.

  20. #20
    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
    Citation Envoyé par moimp Voir le message
    Il faut que les deux variables soient valides.
    Dans ce cas c'est bien un "et logique" (&&) qu'il faut...

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

Discussions similaires

  1. champ d'un formulaire alimenté par une liste de choix d'un pop-up
    Par jeremili dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/01/2010, 19h32
  2. Réponses: 6
    Dernier message: 29/07/2009, 15h31
  3. Réponses: 3
    Dernier message: 28/03/2008, 18h00
  4. Réponses: 1
    Dernier message: 20/03/2007, 09h24
  5. [Debutant]Remplacer une liste de valeur par une liste de val
    Par Sebbo dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 31/03/2006, 12h15

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