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

jQuery Discussion :

Clonage et affectation d'élément


Sujet :

jQuery

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2019
    Messages : 35
    Par défaut Clonage et affectation d'élément
    Bonjour à vous je suis après faire une page qui montre la météo actuel et sur une période de 36 heures à l'aide de l'API -> api.openweathermap.org/data/2.5/forecast

    J'ai raccourci le code le plus possible pour présenter le problème.

    dans mon HTML j'ai la classe modele" qui est dans un TR ainsi elle contient les classes suivantes "heure, temperature, icone, conditions

    j'ai cloné le TR 12X et j'ai modifié le nom de chaque Class pour rajouter un nombre a la fin du nom de la classe.

    la variable Liste contient les informations sur une période de 5 jours avec une distance de 3h entre chaque.

    donc rendu à la dernière boucle dans mon code j'essaie de faire ceci : $(".conditions" + i)[0].textContent = list[i].weather[0].description;.

    en résumé si je comprends bien c'est que tous les classes avec le nom conditions avec un nombre de 0 @ 11 seront remplacé par le contenue de la variable list qui boucle de 0 @ 11 et va insérer les informations dans les classes conditions.

    mais bien sure cela ne fonctionne pas et je cherche à comprendre....

    si vous voulez avoir le code en entier voici mon gitHub : https://github.com/MI7QC/API_Meteo_AJax


    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
    <!DOCTYPE html>
    <html lang="fr">
     
    <head>
        <meta charset="UTF-8" />
        <title>Ajax API Open Weather</title>
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/weather-icons/2.0.10/css/weather-icons.css">
        <link rel="stylesheet" href="style/main.css">
    </head>
     
    <body>
        <main>
            <section id="previsions">
                <h3>Prévisions Météo</h3>
                <div id="info_panel">
                    <ul>
                    </ul>
                </div>
                <div id="data_panel">
                    <table id="tb_prevision">
                        <thead>
                            <tr>
                                <th>Heure</th>
                                <th>Temp</th>
                                <th>Icône</th>
                                <th>Desc</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr class="modele">
                                <td class="heure"></td>
                                <td class="temperature"></td>
                                <td class="icone"><img src="" alt="" /></td>
                                <td class="conditions"></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </section>
        </main>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <script src="script/main.js"></script>
    </body>
    </html>



    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
    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
    88
    89
    90
    //Icone qui sera afficher a l'écrans a l'aide de la description condition meteo
    const meteoImg = {
        "Rain": "wi wi-day-rain",
        "Clouds": "wi wi-day-cloudy",
        "Clear": "wi wi-day-cloudy",
        "Snow": "wi wi-day-snow",
        "Mist": "wi wi-day-fog",
        "Drizzle": "wi wi-day-sleet",
        "Thunderstorm": "wi wi-thunderstorm"
    }
     
    // la première lettre d'un mot soit en Majuscule
    function lettreMaj(str) {
        return str.charAt(0).toUpperCase() + str.slice(1);
    }
     
    //Fournir heure au format hh:mm à partir d'un timestamp
    const CONV = {
        dt_a_hm: dt => {
            let date = new Date(dt * 1000);
            return ("0" + date.getHours()).substr(-2) + "h" + (date.getMinutes() + "0").substr(0, 2);
        }
    }
     
     
    //main function
    async function main() {
        let ville;
     
        // recupere les données sur le serveur openweathermap pour avoir la meteo sur 5 jours
        const meteo2 = await fetch("http://api.openweathermap.org/data/2.5/forecast?q=" + ville + "&APPID=d372021858e26c181fc642ca0f0dbd18&units=metric")
            .then(resultat => resultat.json())
            .then(json => json)
    }
        afficherMeteoInfo2(meteo2)
     
    //fonction qui affiche le rendu a l'écrans
    function afficherMeteoInfo2(data2) {
     
        // Récupère toute la liste des informations météo sur 5 jours
        let list = data2.list;
     
        // petit test pour l'icone...
        const conditions = list[0].weather[0].main;
     
     
       //Clonage de la <tr class="modele"> Modification du nom pour les classe  model,heure,temperature,icone,condition  pour avoir une numérotation.  
        $(document).ready(function () {
            var eM = $('.modele');
            var eH = $('.heure');
            var eT = $('.temperature');
            var eW = $('.icone');
            var eC = $('.conditions');
     
            for (var i = 0; i < 13; i++) {
                eM.attr("class", "modele" + i)
                eH.attr("class", "heure" + i)
                eT.attr("class", "temperature" + i)
                eW.attr("class", "icone" + i)
                eC.attr("class", "conditions" + i)
     
                eM.clone().insertBefore(eM);
                $(".modele12").remove();
            }
        });
     
        // récupération des donné  Heure,Temp,Icone,Description
        for (var i = 0; i <= 12; i++) {
     
            //test info
            console.log(" list[i].dt : ", CONV.dt_a_hm(list[i].dt));
            console.log(" list[i].main.temp : ", list[i].main.temp);
            console.log(" list[i].weather[0].description : ", list[i].weather[0].description);
            console.log(" list[i].weather[0].icon : ", list[i].weather[0].icon);
            console.log("-------------------------------------", i);
     
            // j'essais d'afficher tous les donnés qui sont dans la liste pour chaque  classe avec leur numérotation. j'ai toujours une Erreur
            $('.heure' + i)[0].innerHTML = CONV.dt_a_hm(list[i].dt);
            $('.temperature' + i)[0].textContent = Math.round(list[i].main.temp);
            $(".conditions" + i)[0].textContent = list[i].weather[0].description;
            $('.icone' + i)[0].className = meteoImg[conditions];
        };
     
        //Ici a l'écrans tous s'affiche 12X  bien sure simplement de la  duplication voir image ...
        //$('.heure')[0].innerHTML = CONV.dt_a_hm(list[i].dt);
        //$('.temperature')[0].textContent = Math.round(list[i].main.temp);
        //$(".conditions")[0].textContent = list[i].weather[0].description;
        //$('.icone')[0].className = meteoImg[conditions];
     
    }
    petite image de ma console on voit bien mon dom.


    ici un aperçus du rendu visuel avec les duplication.

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 496
    Par défaut
    Bonjour,

    Vu que c'est le forum jQuery et que tu l'utilises déjà, je te suggère de ré-écrire ton code avec la syntaxe appropriée.

    Je ne sais pas pourquoi tu veux gérer ça avec des class alors que la solution est bien plus simple que ça.

    Donc si on veut résumer tout ça avec jQuery.each, jQuery.find et jQuery.next :
    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
     
    /* les autres fonctions ...*/
     
    //lorsque le document est chargé :
    $(document).ready(function(){
        let ville='MONTREAL';
        fetch("https://api.openweathermap.org/data/2.5/forecast?q=" + ville + "&APPID=d372021858e26c181fc642ca0f0dbd18&units=metric")
            .then(resultat => resultat.json())
            .then(data=>{
              //console.log(data.list);
              $.each(data.list,(index,obj)=>{
                let tr=$('#tb_prevision tbody .modele').eq(0).clone();
                tr.find('.heure').text(CONV.dt_a_hm(obj.dt))
                .next('.temperature').text(Math.round(obj.main.temp))
                .next('.icone').attr('class',meteoImg[obj.weather[0].main])
                //il faut mettre la bonne valeur dans l'url !
                .find('img').attr('src',"url..."+obj.weather[0].icon)
                .parent('td')
                .next('.conditions').text(obj.weather[0].description)
                .parent('.modele').removeClass('modele')
                .appendTo('#tb_prevision tbody');
              });
              $('#tb_prevision tbody tr').eq(0).remove();
            });
    });
    Pour l'icone, je crois qu'il y a quelque chose qui manque (l'url ), parce que le obj.weather[0].icon est un code de 3 caractères (01d, 01n,...) qui doit être concaténer avec un url afin d'afficher l'image correspondante.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2019
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2019
    Messages : 35
    Par défaut
    Merci de la réponse la syntaxe c'est vrai quel est vraiment clean j'ai plus ou moins 20 heures d’expérience en Jquery j'ai des croûtes à manger et beaucoup à apprendre.

    aujourd'hui j'ai faits une bonne percée je passais ici pour mettre mon code à jour pour montrer une solution plus courte, j'ai encore un problème d'insertion d'icône mais je crois avec ce que tu as poster je vais remédier à mon problème.

    je vais prendre le temps de bien lire ce que tu as fait je vois que tu utilises le chaining chose que faut absolument que je pratique.

    mon problème c'est que j'utilisais une boucle for alors que je devais utiliser une boucle for in pour manipuler des objets (si je ne dis pas de bêtise)

    dans mon code j'ai rajouté la fonction qui appelle l'URL pour trouver l'icône via son code numérique pour le site http://openweathermap.org/img/w/10d.png c'est dommage parce que les icônes sur openweathermap ne sont pas très jolies et dans ma première section j'utilisais ce lien : http://erikflowers.github.io/weather-icons/ mais je ne trouve pas une solution similaire au lien posté plus haut, qu'on n'a juste à insérer le code dans le url

    j'ai posté mon code en entier, la section que j'ai postée à mon premier poste se trouve à la ligne 103 //section2 j'ai réussi à faire ça en 18 lignes de code.

    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
    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
     
    /**
     * ajax_openweather
     * Fichier script/main.js
     */
    "use strict";
     
     
    const meteoImg = {
        "Rain": "wi wi-day-rain",
        "Clouds": "wi wi-day-cloudy",
        "Clear": "wi wi-day-cloudy",
        "Snow": "wi wi-day-snow",
        "Mist": "wi wi-day-fog",
        "Drizzle": "wi wi-day-sleet",
        "Thunderstorm": "wi wi-thunderstorm",
        "clear sky": "wi wi-day-cloudy",
        "few clouds": "wi wi-day-cloudy",
        "scattered clouds": "wi wi-day-cloudy",
    }
     
    // la premiere lettre d'un mot soit en Majuscule
    function lettreMaj(str) {
        return str.charAt(0).toUpperCase() + str.slice(1);
    }
     
    //Fournir heure au format hh:mm à partir d'un timestamp
    const CONV = {
        dt_a_hm: dt => {
            let date = new Date(dt * 1000);
            return ("0" + date.getHours()).substr(-2) + "h" + (date.getMinutes() + "0").substr(0, 2);
        }
    }
     
    //Recherche une icone par sont code numérique via le url
    const OW_API = {
        base_icon_url: 'http://openweathermap.org/img/w/',
     
        //http://openweathermap.org/img/w/10d.png
        get_icon_url: function (icon_id) {
            return this.base_icon_url + icon_id + ".png";
        },
    };
     
     
    //Main fonction localiser IP -> trouver ville via IP ->insérer les donné recupérer dans l'url
    async function main(avecIp = true) {
        let ville;
     
        if (avecIp) {
            //1 Récuperer l'adresse IP de l'utilisateur a l'ouverture de la page
            const ip = await fetch('https://api.ipify.org?format=json')
                .then(resultat => resultat.json())
                .then(json => json.ip);
     
            // access key pour api.ipstack
            var access_key = 'e4e6cacb338614447698c31a63d3ffbc';
     
            //2 Récupérer de la localisation grace a l'adresse recupérer plus haut
            ville = await fetch('http://api.ipstack.com/' + ip + '?access_key=' + access_key)
                .then(resultat => resultat.json())
                .then(json => json.city);
        } else {
            ville = document.querySelector('#ville').textContent;
        }
     
     
        const meteo = await fetch("http://api.openweathermap.org/data/2.5/weather?q=" + ville + "&APPID=d372021858e26c181fc642ca0f0dbd18&units=metric")
            .then(resultat => resultat.json())
            .then(json => json)
     
        console.log("ceci est meteo 1 : ", meteo);
        //4 afficher les information sur la page
        afficherMeteoInfo(meteo)
     
     
        // recupere les données sur le server openweathermap pour avoir meteo sur 5 jours
        const meteo2 = await fetch("http://api.openweathermap.org/data/2.5/forecast?q=" + ville + "&APPID=d372021858e26c181fc642ca0f0dbd18&units=metric")
            .then(resultat => resultat.json())
            .then(json => json)
     
        console.log("meteo 2 forcast : ", meteo2);
        afficherMeteoInfo2(meteo2)
    }
     
     
    //tous les informations importante pour l'utilisateur
    function afficherMeteoInfo(data) {
        const name = data.name;
        const temperature = data.main.temp;
        const conditions = data.weather[0].main;
        const description = data.weather[0].description;
     
        $('#ville')[0].textContent = name;
        $('#temperature')[0].textContent = Math.round(temperature);
        $('#conditions')[0].textContent = lettreMaj(description);
        $('i.wi')[0].className = meteoImg[conditions];
     
        document.body.className = conditions.toLowerCase();
    }
     
     
     
    //Section 2
    function afficherMeteoInfo2(data2) {
     
        var compteur = 0
        var eM = $('.modele');
        for (let item in data2.list) {
            if (compteur >= 12) {
                break;
            }
            $('.heure')[item].innerHTML = CONV.dt_a_hm(data2.list[item]['dt'])
            $('.temperature')[item].innerHTML = Math.round(data2.list[item]['main']['temp'])
            $('.icone')[item].textContent = OW_API.get_icon_url(data2.list[item]['weather'][0].icon)
            $('.description')[item].textContent = data2.list[item]['weather']['0']['description']
            eM.clone().insertBefore(eM);
            compteur++;
        }
        $(".modele").last().remove();
    }
     
     
    //recuperation de l'id ville
    const ville = document.querySelector('#ville');
     
    //Permet d'éditer le champ ville
    ville.addEventListener('click', () => {
        ville.contentEditable = true;
    });
     
     
    //Permet a l'aide de la touche Entrer d'envoyer notre confirmation
    //prevenDefault pour pas avoir de saut de ligne
    ville.addEventListener('keydown', (e) => {
        if (e.keyCode === 13) {
            e.preventDefault();
            ville.contentEditable = false;
            main(false);
        }
    })
     
    main();

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/11/2009, 10h46
  2. Réponses: 0
    Dernier message: 02/07/2009, 17h00
  3. affecter la même liste d'élément à plusieurs Listbox
    Par elombre dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/05/2009, 08h24
  4. Affecter un événement à un élément de menu
    Par DiverSIG dans le forum Débuter
    Réponses: 4
    Dernier message: 11/02/2009, 18h14
  5. affectation d'éléments à un tableau
    Par Docphil01 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/11/2008, 21h48

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