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 :

Afficher liste communes ayant un code postal donné


Sujet :

JavaScript

  1. #41
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    J'ai un souci : y a une heure, ça marchait sans problème. Puis, j'ai eu ce message d'erreur : Erreur requete

    Pensant à une erreur de ma part, je suis reparti sur ton code initial (juste corrigé les quelques erreurs (la balise <head> en trop et l'identifiant commune au lieu de departement)) :

    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
    <!doctype html>
    <html lang="fr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <style type="text/css">
     
                body{
                    font-family:Verdana, Geneva, sans-serif;
                    background-color:#b2bdc6;
                }
            </style>
            <script>
                function rest(){
     
                    var cp=document.getElementById('departement').value
     
                    var adresse='https://geo.api.gouv.fr/communes?codePostal='+cp
     
                    fetch(adresse)
                        .then(response => response.json())
                        .then(function(zozone) {
     
                                document.getElementById("ville").options.length = 1
     
                                for ( var i = 0 ; i < zozone.length ; i++) {
     
                                    var commune=zozone[i].nom
     
                                    document.getElementById("ville")[i+1]=new Option(commune, commune)
                                }
                            }
                        )
                        .catch(error => alert("Erreur requete"));
                }
     
            </script>
        </head>
    <body>
    <br><br><br>
    <label for="departement">code departement :</label>
    <input type ="text" id="departement" placeholder="Entrer votre Code Postal"/>
     
    <button onclick="rest()">valider</button>
     
    <br><br><br>
     
    <select  id="ville"><option selected="true" disabled="disabled">- Choisir une commune -</option>
    </select>
    </body>
    </html>


    Mais il me met aussi ce message d'erreur...Qu'en penses tu melka one ?

  2. #42
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 670
    Points
    44 670
    Par défaut
    Citation Envoyé par melka one
    comme ça c'est mieux
    Oui tu aurais même pu aller un peu plus avant en utilisant la méthode HTMLSelectElement.add(), je n'aime vraiment pas cette écriture :document.getElementById("ville")[i + 1].
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //document.getElementById("ville").options.length = 1
    const oSelect = document.getElementById("ville");   // mise en cache
    oSelect.options.length = 1;
     
    for (var i = 0; i < zozone.length; i++) {
      var commune = zozone[i].nom
      //document.getElementById("ville")[i + 1] = new Option(commune, commune)
      // utilisation de la méthode add sur les HTMLSelectElement
      oSelect.add(new Option(commune, commune));
    }


    Citation Envoyé par laurentSc
    Merci NoSmoking pour ta réponse qui me dépanne.
    Certes mais l'horizon s'obscurcie à chaque fois un peu plus


    la solution que tu m'as proposée au post 29 utilise du HTML, du CSS et du JS
    oui mais chacun est indépendant le CSS c'est du cosmétique qui, dans le cas présent, n'a aucune incidence sur le fonctionnement du code.
    Pour tester il suffit d'ouvrir le lien dans FireFox, de choisir le menu Affichage -> Style de la page -> Aucun style et ... miracle cela fonctionne quand même


    Je souhaite si possible regrouper tout le code dans un seul fichier. En effet, l'objectif est d'intégrer ce code dans un site créé avec un CMS donc si la personne qui s'en charge n'est pas moi (c'est possible), ça sera plus simple à faire si tout est dans un seul fichier.
    est-ce bonne idée, pas à mon sens, celui qui récupérera ton code perdra peut-être rapidement ses cheveux.


    Ce principe, j'ai essayé de l'appliquer à ton code NoSmoking (avant que n'arrive le post 36), mais l'action n'est pas exécutée...(elle n'apparaît pas dans le rectangle "serveur")
    Lors de l'utilisation d'Ajax les informations du bouton de soumission ne sont pas transmises voilà pourquoi ton if (isset($_POST['action_form'])) est muet, c'est quelque chose qu'il faut avoir en tête.
    Une autre chose, dans le même ordre d'idée, est qu'un élément <button> est de type="submit par défaut et donc lorsqu’il est inséré dans un élément <form> le formulaire est envoyé.

    Au passage le fait de rajouter un event.preventDefault(), dans le code de melka one va à l'encontre de ce que tu essaies de faire, donc comme tu dis cela marche jusqu'à ce que tu nous dises mais que cela ne marche pas


    Du coup, j'ai 2 solutions. J'espère parvenir à intégrer mon code à l'une d'elles. Je vous tiens au courant.
    en fait c'est la même !!


    Bon tout cela pour dire que « tu n'as pas le cul sorti des ronces » !

  3. #43
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    donc comme tu dis cela marche jusqu'à ce que tu nous dises mais que cela ne marche pas
    Je suis particulièrement doué pour cela...
    La preuve, je remets ça...

    Ce matin (post 47), j'avais appliqué avec succès ton conseil mais là, ça marche plus...

    Comme je vois pas le bug, je te donne tout le code (j'ai simplifié le html pour le debug) :

    htmlsimplenosmokingplusceddebug.php :
    Code html+php : 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
    <!doctype html>
    <html lang="fr">
    <head>
        <meta charset="utf-8">
        <link href="stylenosmoking.css" rel="stylesheet">
        <title>Titre de la page</title>
     
    </head>
    <body>
    <?php var_dump($_POST);//donne array(0) { } ?>
    <main>
        <header>
            <time datetime="2024-04-17">Avril 2024</time>
            <h1>Récupération communes</h1 
            <p>Afficher les communes disponibles pour un code postal donné en utilisant l API <a href="https://geo.api.gouv.fr/decoupage-administratif/communes" target="geo">geo.api.gouv.fr</a>.</p>
        </header>
        <section>
            <h2>Formulaire</h2>
            <div class="group-saisie">
                <form method="POST" action="traitcp.php">
     
     
                    <label for="nb_pieces"> <span style="color: red;">*</span><span> Nombre de pièces</span> :<br/></label>
                    <input type="number" id="nb_pieces" name="nb_pieces"  value="<?= $_POST['nb_pieces'] ?? "0" ?>" /><br/><br/>
                    <!------------------------
                    ----------------------------->
                    <fieldset>
                        <legend>Info commune</legend>
                        <p>
                            <label for="input-code">Code postal</label>
                            <input name="cp-commune" id="input-code" value="" pattern="^\d{5}$" required>
                        </p>
                        <p>
                            <label for="select-villes">Commune</label>
                            <select name="nom-commune" id="select-villes" required>
                                <option value="">Choix commune</option>
                            </select>
                            <span class="warning">Aucune info disponible</span>
                        </p>
                        <p>
                            <button type="reset">Annuler</button>
                            <button>Valider</button>
                        </p>
                    </fieldset>
                </form>
            </div>
        </section>
        <section>
            <h2>Serveur</h2>
            <output></output>
        </section>
    </main>
    <script src="scriptnosmoking.js"></script>
    </body>
    </html>

    scriptnosmoking.js :
    Code js : 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
    "use strict";
    // modif : 18/04/2024
    // création méthode getListeVilles pour plus de cohérence dans le code
    // la méthode start devient ainsi plus concise
    const App = {
        selectVilles: document.getElementById("select-villes"),
        inputCode: document.getElementById("input-code"),
        formElement: document.querySelector("form"),
     
        resetSelect: function() {
            this.selectVilles.options.length = 1;
            this.selectVilles.setAttribute("disabled", "disabled");
        },
     
        sendDatas: function(e) {
            e.preventDefault();
            const f = this.formElement;
            const output = document.querySelector("output");
            // info requête
            const reqURL = f.getAttribute("action");
            output.textContent = "";
            fetch(reqURL, {
                method: f.method,
                body: new FormData(f)
            })
                .then((reponse) => reponse.text())
                .then(data => {
                    output.innerHTML = data;
                })
            /*f.reset();
            this.resetSelect();*/
        },
     
        updateListeVilles: function(datas) {
            // purge sauf 1st
            this.selectVilles.options.length = 1;
            // on met dans l'ordre
            datas.sort((a, b) => a.nom.localeCompare(b.nom));
            const list = datas.map((data) => new Option(data.nom, data.nom));
            // on ajoute
            this.selectVilles.append(...list);
            if (datas.length) {
                this.selectVilles.removeAttribute("disabled");
                this.selectVilles.value = datas[0].nom;
                if (datas.length > 1) this.selectVilles.focus();
            }
        },
     
        getListeVilles: function(e) {
            this.resetSelect();
            const value = e.target.value;
            if (Number(value) && value.length == 5) {
                const url = "https://geo.api.gouv.fr/communes?codePostal=" + value;
                fetch(url)
                    .then((reponse) => reponse.json())
                    .then(data => this.updateListeVilles(data))
            }
        },
     
        start: function() {
            this.resetSelect();
            this.formElement.addEventListener("submit",this.sendDatas.bind(this));
            this.formElement.addEventListener("reset", this.resetSelect.bind(this));
            this.inputCode.addEventListener("input", this.getListeVilles.bind(this));
        }
    }
    App.start();

  4. #44
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    Lors de l'utilisation d'Ajax les informations du bouton de soumission ne sont pas transmises voilà pourquoi ton if (isset($_POST['action_form'])) est muet
    En effet, je viens de redéporter l'action dans traitcp.php qui contient :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <?php
        var_dump($_POST);
        ?>
    et $_POST['calc_prix'] n'existe pas malgré <input type="submit" name="calc_prix" value="Valider">

  5. #45
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Autre point : après soumission du formulaire, le contenu de celui-ci est réinitialisé alors que je souhaite maintenir les valeurs saisies avec par exemple <input type="radio" id="maison" name="m_a" value="maison" <?= ($_POST['m_a'] ?? '') === 'maison' ? ' checked' : 'checked' ?> />
    Mon code (le tien légèrement augmenté avec une partie du mien) est :
    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
    80
    81
    82
    83
    84
    85
    86
    87
    <!doctype html>
    <html lang="fr">
    <head>
        <meta charset="utf-8">
        <title>Titre de la page</title>
        <link href="stylenosmoking.css" rel="stylesheet">
     
    </head>
    <body>
    <main>
        <header>
            <time datetime="2024-04-17">Avril 2024</time>
            <h1>Récupération communes</h1>
            <p>Afficher les communes disponibles pour un code postal donné en utilisant l API <a href="https://geo.api.gouv.fr/decoupage-administratif/communes" target="geo">geo.api.gouv.fr</a>.</p>
        </header>
        <section>
            <h2>Formulaire</h2>
            <div class="group-saisie">
                <form method="POST" action="traitcp.php">
                    <fieldset>
                        <legend><span style="color: red;">*</span>Type du logement :</legend>
                        <p>
                            <label for="maison">Maison</label>
                            <input type="radio" id="maison" name="m_a" value="maison" <?= ($_POST['m_a'] ?? '') === 'maison' ? ' checked' : 'checked' ?> />
                        </p>
                        <p>
                            <label for="appartement">Appartement</label>
                            <input type="radio" id="appartement" name="m_a" value="appartement" <?= ($_POST['m_a'] ?? '') === 'appartement' ? ' checked' : '' ?> />
                        </p>
                    </fieldset>
                    <fieldset>
                    <legend><span style="color: red;">*</span>Nature de la transaction :</legend>
                        <p>
                        <label for="vente">vente</label>
                        <input type="radio" id="vente" name="transaction" value="vente" <?= ($_POST['transaction'] ?? '') === 'vente' ? ' checked' : '' ?> />
                        </p>
                        <p>
                        <label for="location">location</label>
                        <input type="radio" id="location" name="transaction" value="location" <?= ($_POST['transaction'] ?? '') === 'location' ? ' checked' : '' ?> />
                        </p>
     
                    <br/>
                    </fieldset>
                    <label for="annee_construction"> <span style="color: red;">*</span><span>Année de construction</span> :<br/></label>
                    <select id="annee_construction" name="annee_construction">
                        <?php $i = ["avant_49","49_97","apres_97"];
                        for ($j=0;$j<3;$j++) {
                            echo '<option value="'.$i[$j].'" '.(($_POST['annee_construction'] ?? '') === $i[$j] ? ' selected' : '').">".str_replace('_',' ',$i[$j])." </option>";
                        }?>
     
                    </select><br/><br/>
                    <!-- fermeture et ouverture d un autre fieldset -->
                    <fieldset>
                        <legend>Info commune</legend>
                        <p>
                            <label for="input-code">Code postal</label>
                            <input name="cp-commune" id="input-code" value="" pattern="^\d{5}$" required>
                        </p>
                        <p>
                            <label for="select-villes">Commune</label>
                            <select name="nom-commune" id="select-villes" required>
                                <option value="">Choix commune</option>
                            </select>
                            <span class="warning">Aucune info disponible</span>
                        </p>
                        <p>
                            <button type="reset">Annuler</button>
                            <input type="submit" name="calc_prix" value="Valider">
                            <!--<button type="submit">Valider</button>-->
                        </p>
                    </fieldset>
                </form>
     
            </div>
        </section>
        <section>
            <h2>Serveur</h2>
            <output></output>
        </section>
    </main>
     
    <script src="scriptnosmoking.js"></script>
     
    </body>
     
     
    </html>

    Ce que je souhaite est-il possible et si oui comment ?

  6. #46
    Modérateur

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 075
    Points : 44 670
    Points
    44 670
    Par défaut
    Ce que je souhaite est-il possible et si oui comment ?
    dans la fonction sendDatas: function(e) {..., il suffit de mettre en commentaire la partie qui « reset » les champs, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          })
        // on fait un peu de nettoyage
        f.reset();
        this.resetSelect();
      },

  7. #47
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Merci (plus tôt dans la journée, j'aurais peut-être trouvé mais hier soir...)

  8. #48
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    oui mais chacun est indépendant le CSS c'est du cosmétique qui, dans le cas présent, n'a aucune incidence sur le fonctionnement du code.
    Je suis d'accord qu'ici le CSS est indépendant du reste par contre le JS, PHP et HTML sont bels et bien liés.
    Juste un exemple : dans le script js, on a const output = document.querySelector("output");. Pour comprendre ça, il vaut mieux voir que dans la partie html, on a <output></output>

  9. #49
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    donc comme tu dis cela marche jusqu'à ce que tu nous dises mais que cela ne marche pas
    Je suis particulièrement doué pour cela...
    La preuve, je remets ça...

    Ce matin (post 47), j'avais appliqué avec succès ton conseil mais là, ça marche plus...

    Comme je vois pas le bug, je te donne tout le code (j'ai simplifié le html pour le debug) :

    htmlsimplenosmokingplusceddebug.php :
    Code html+php : 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
    <!doctype html>
    <html lang="fr">
    <head>
        <meta charset="utf-8">
        <link href="stylenosmoking.css" rel="stylesheet">
        <title>Titre de la page</title>
     
    </head>
    <body>
    <?php var_dump($_POST);//donne array(0) { } ?>
    <main>
        <header>
            <time datetime="2024-04-17">Avril 2024</time>
            <h1>Récupération communes</h1 
            <p>Afficher les communes disponibles pour un code postal donné en utilisant l API <a href="https://geo.api.gouv.fr/decoupage-administratif/communes" target="geo">geo.api.gouv.fr</a>.</p>
        </header>
        <section>
            <h2>Formulaire</h2>
            <div class="group-saisie">
                <form method="POST" action="traitcp.php">
     
     
                    <label for="nb_pieces"> <span style="color: red;">*</span><span> Nombre de pièces</span> :<br/></label>
                    <input type="number" id="nb_pieces" name="nb_pieces"  value="<?= $_POST['nb_pieces'] ?? "0" ?>" /><br/><br/>
                    <!------------------------
                    ----------------------------->
                    <fieldset>
                        <legend>Info commune</legend>
                        <p>
                            <label for="input-code">Code postal</label>
                            <input name="cp-commune" id="input-code" value="" pattern="^\d{5}$" required>
                        </p>
                        <p>
                            <label for="select-villes">Commune</label>
                            <select name="nom-commune" id="select-villes" required>
                                <option value="">Choix commune</option>
                            </select>
                            <span class="warning">Aucune info disponible</span>
                        </p>
                        <p>
                            <button type="reset">Annuler</button>
                            <button>Valider</button>
                        </p>
                    </fieldset>
                </form>
            </div>
        </section>
        <section>
            <h2>Serveur</h2>
            <output></output>
        </section>
    </main>
    <script src="scriptnosmoking.js"></script>
    </body>
    </html>

    scriptnosmoking.js :
    Code js : 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
    "use strict";
    // modif : 18/04/2024
    // création méthode getListeVilles pour plus de cohérence dans le code
    // la méthode start devient ainsi plus concise
    const App = {
        selectVilles: document.getElementById("select-villes"),
        inputCode: document.getElementById("input-code"),
        formElement: document.querySelector("form"),
     
        resetSelect: function() {
            this.selectVilles.options.length = 1;
            this.selectVilles.setAttribute("disabled", "disabled");
        },
     
        sendDatas: function(e) {
            e.preventDefault();
            const f = this.formElement;
            const output = document.querySelector("output");
            // info requête
            const reqURL = f.getAttribute("action");
            output.textContent = "";
            fetch(reqURL, {
                method: f.method,
                body: new FormData(f)
            })
                .then((reponse) => reponse.text())
                .then(data => {
                    output.innerHTML = data;
                })
            /*f.reset();
            this.resetSelect();*/
        },
     
        updateListeVilles: function(datas) {
            // purge sauf 1st
            this.selectVilles.options.length = 1;
            // on met dans l'ordre
            datas.sort((a, b) => a.nom.localeCompare(b.nom));
            const list = datas.map((data) => new Option(data.nom, data.nom));
            // on ajoute
            this.selectVilles.append(...list);
            if (datas.length) {
                this.selectVilles.removeAttribute("disabled");
                this.selectVilles.value = datas[0].nom;
                if (datas.length > 1) this.selectVilles.focus();
            }
        },
     
        getListeVilles: function(e) {
            this.resetSelect();
            const value = e.target.value;
            if (Number(value) && value.length == 5) {
                const url = "https://geo.api.gouv.fr/communes?codePostal=" + value;
                fetch(url)
                    .then((reponse) => reponse.json())
                    .then(data => this.updateListeVilles(data))
            }
        },
     
        start: function() {
            this.resetSelect();
            this.formElement.addEventListener("submit",this.sendDatas.bind(this));
            this.formElement.addEventListener("reset", this.resetSelect.bind(this));
            this.inputCode.addEventListener("input", this.getListeVilles.bind(this));
        }
    }
    App.start();

  10. #50
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 828
    Points
    5 828
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    comme mon souci n'est toujours pas résolu, je détaille ma démarche et si y a un loup, merci de me le dire.

    étape 1- Je pars de ton code :
    htmlsimplenosmoking.php : (même s'il n'y a que du code html, par habitude, j'utilise toujours l'extension php)
    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
    <!doctype html>
    <html lang="fr">
    <head>
        <meta charset="utf-8">
        <link href="stylenosmoking.css" rel="stylesheet">
        <title>Titre de la page</title>
     
    </head>
    <body>
    <main>
        <header>
            <time datetime="2024-04-17">Avril 2024</time>
            <h1>Récupération communes</h1>
            <p>Afficher les communes disponibles pour un code postal donné en utilisant l'API <a href="https://geo.api.gouv.fr/decoupage-administratif/communes" target="geo">geo.api.gouv.fr</a>.</p>
        </header>
        <section>
            <h2>Formulaire</h2>
            <div class="group-saisie">
                <form method="POST" action="traitcp.php">
                    <fieldset>
                        <legend>Info commune</legend>
                        <p>
                            <label for="input-code">Code postal</label>
                            <input name="cp-commune" id="input-code" value="" pattern="^\d{5}$" required>
                        </p>
                        <p>
                            <label for="select-villes">Commune</label>
                            <select name="nom-commune" id="select-villes" required>
                                <option value="">Choix commune</option>
                            </select>
                            <span class="warning">Aucune info disponible</span>
                        </p>
                        <p>
                            <button type="reset">Annuler</button>
                            <button>Valider</button>
                        </p>
                    </fieldset>
                </form>
            </div>
        </section>
        <section>
            <h2>Serveur</h2>
            <output></output>
        </section>
    </main>
    <script src="scriptnosmoking.js"></script>
     
    </body>
    </html>

    scriptnosmoking.js
    Code js : 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
    "use strict";
    // modif : 18/04/2024
    // création méthode getListeVilles pour plus de cohérence dans le code
    // la méthode start devient ainsi plus concise
    const App = {
        selectVilles: document.getElementById("select-villes"),
        inputCode: document.getElementById("input-code"),
        formElement: document.querySelector("form"),
     
        resetSelect: function() {
            this.selectVilles.options.length = 1;
            this.selectVilles.setAttribute("disabled", "disabled");
        },
     
        sendDatas: function(e) {
            e.preventDefault();
            const f = this.formElement;
            const output = document.querySelector("output");
            // info requête
            const reqURL = f.getAttribute("action");
            output.textContent = "";
            fetch(reqURL, {
                method: f.method,
                body: new FormData(f)
            })
                .then((reponse) => reponse.text())
                .then(data => {
                    output.innerHTML = data;
                })
            /*f.reset();
            this.resetSelect();*/
        },
     
        updateListeVilles: function(datas) {
            // purge sauf 1st
            this.selectVilles.options.length = 1;
            // on met dans l'ordre
            datas.sort((a, b) => a.nom.localeCompare(b.nom));
            const list = datas.map((data) => new Option(data.nom, data.nom));
            // on ajoute
            this.selectVilles.append(...list);
            if (datas.length) {
                this.selectVilles.removeAttribute("disabled");
                this.selectVilles.value = datas[0].nom;
                if (datas.length > 1) this.selectVilles.focus();
            }
        },
     
        getListeVilles: function(e) {
            this.resetSelect();
            const value = e.target.value;
            if (Number(value) && value.length == 5) {
                const url = "https://geo.api.gouv.fr/communes?codePostal=" + value;
                fetch(url)
                    .then((reponse) => reponse.json())
                    .then(data => this.updateListeVilles(data))
            }
        },
     
        start: function() {
            this.resetSelect();
            this.formElement.addEventListener("submit",this.sendDatas.bind(this));
            this.formElement.addEventListener("reset", this.resetSelect.bind(this));
            this.inputCode.addEventListener("input", this.getListeVilles.bind(this));
        }
    }
    App.start();

    - étape 2
    J'ajoute au formulaire un champ, donc ce code :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <label for="nb_pieces"> <span style="color: red;">*</span><span> Nombre de pièces</span> :<br/></label>
            <input type="number" id="nb_pieces" name="nb_pieces"  value="<?= $_POST['nb_pieces'] ?? "0" ?>" /><br/><br/>

    donc ton script devient :
    stop
    j'étais en train de tout refaire pour décrire ma démarche et mettre en évidence le problème mais celui-ci a disparu...Mystère, mais tant mieux.

    Prochain problème : bientôt

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/09/2011, 15h09
  2. Afficher les coordonnées d'un code postal sur une carte
    Par FredericB dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 08/12/2007, 16h54
  3. Liste déroulante et code postal (Lenteur)
    Par x0249 dans le forum IHM
    Réponses: 11
    Dernier message: 15/05/2007, 18h06
  4. Réponses: 1
    Dernier message: 29/04/2007, 18h44
  5. Réponses: 5
    Dernier message: 23/02/2006, 22h12

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