Partage
  • Partager sur Facebook
  • Partager sur Twitter

appendChild ajoutant un seul élément

Sujet résolu
    21 octobre 2021 à 20:23:08

    Bonjour, je cherche à faire un système de panier sur mon site (qui doit s'actualiser sans rechargement de la page, afin de pouvoir le visionner sans changer de page).

    J'ai donc une structure de base dans mon HTML que je récupère, et que je clone en JS. Lorsque l'utilisateur ajoute un élément dans son panier, je supprime tous les enfants de cette div, et je rajoute la nouvelle liste d'élément mis à jour.

    Le problème c'est que s'il y a plusieurs éléments (et donc plusieurs itérations dans mon forEach) ça ne m'ajoute qu'un seul élément et non plusieurs, et pourtant dans la console il y a bien plusieurs éléments ressortit par le console.log().

    Code :

    const cartContent = document.getElementById("cartContent");
    let clone = document.querySelector(".cartArticle").cloneNode(true);
    
    function displayArti(array) {
        while (cartContent.hasChildNodes()) {
            cartContent.removeChild(cartContent.lastChild);
        }
        let totalCost = 0;
        array.forEach(elt => {
            totalCost = totalCost + (elt[6]*elt[3]);
    
            clone.querySelector(".artiTitle").innerHTML = elt[5];
            clone.querySelector(".artiDesc").innerHTML = "Prix : "+elt[6]+"€ | Quantité : "+elt[3];
            console.log(clone);
            cartContent.appendChild(clone);
        });
        buyMenu.style.display = "flex";
        amountDiv.innerHTML = "Total : " + totalCost + "€";
        
    }

    D'où viendrait mon problème ? Ai-je oublié quelque chose ? Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2021 à 21:02:48

      Bonjour je ne suis pas totalement sur mais je pense que cela peut venir du fait que tu as cloné l'élément en dehors de ta boucle donc tu manipule le même clone à chaque tour de boucle, en re créant le clone à chaque itération tu obtient un nouvel élément à chaque fois.

      const cartContent = document.getElementById("cartContent");
      let cardArticle = document.querySelector(".cartArticle");
       
      function displayArti(array) {
          while (cartContent.hasChildNodes()) {
              cartContent.removeChild(cartContent.lastChild);
          }
          let totalCost = 0;
          array.forEach(elt => {
              totalCost = totalCost + (elt[6]*elt[3]);
              
              // re créé un clone de l'élément pour chaque tour de boucle
              const clone = cardArticle.cloneNode(true);
       		
              // modifie le clone actuel
              clone.querySelector(".artiTitle").innerHTML = elt[5];
              clone.querySelector(".artiDesc").innerHTML = "Prix : "+elt[6]+"€ | Quantité : "+elt[3];
              
              console.log(clone);
              
              // ajoute le clone actuel dans le DOM
              cartContent.appendChild(clone);
          });
          buyMenu.style.display = "flex";
          amountDiv.innerHTML = "Total : " + totalCost + "€";
           
      }

      • Partager sur Facebook
      • Partager sur Twitter

      suggestion de présentation.

        21 octobre 2021 à 21:23:34

        En effet en le recréant ca marche niquel, merci ! (j'ai juste recréer après le appendChild et conserver la première création au dessus, sinon je pouvais pas cloner a cause du while qui supprime tout)

        const cartContent = document.getElementById("cartContent");
        let clone = document.querySelector(".cartArticle").cloneNode(true);
        
        function displayArti(array) {
        
            while (cartContent.hasChildNodes()) {
                cartContent.removeChild(cartContent.lastChild);
            }
            let totalCost = 0;
            array.forEach(elt => {
                totalCost = totalCost + (elt[6]*elt[3]);
        
                clone.querySelector(".artiTitle").innerHTML = elt[5];
                clone.querySelector(".artiDesc").innerHTML = "Prix : "+elt[6]+"€ | Quantité : "+elt[3];
                cartContent.appendChild(clone);
                clone = document.querySelector(".cartArticle").cloneNode(true);
            });
            buyMenu.style.display = "flex";
            amountDiv.innerHTML = "Total : " + totalCost + "€";
            
        }



        • Partager sur Facebook
        • Partager sur Twitter

        appendChild ajoutant un seul élément

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown