`appendChild` inside a `for` loop just replaces item created by `createElement`

17,344

Solution 1

From the MDN on appendChild :

Adds a node to the end of the list of children of a specified parent node. If the node already exists it is removed from current parent node, then added to new parent node.

When you append an element that is yet in the DOM, you move it from its old place. Create the element in the loop :

startBtn.onclick = function(){
    removeButton = document.getElementById("start");
    removeButton.parentNode.removeChild(removeButton);

    for(var i = 0; i < cards; i++){ 
        var backside = document.createElement("div");
        backside.className = 'card';
        board.appendChild(backside);
    }
};

Solution 2

You're creating a single element and trying to re-add it multiple times. You need to create multiple elements.

When you run document.createElement that creates the element in the DOM. AppendChild is just setting the location. So you create one element and then move it to the same place many times. You want to instead create many elements and set their location once each

var backside;
startBtn.onclick = function(){
    removeButton = document.getElementById("start");
    removeButton.parentNode.removeChild(removeButton);

    for(var i = 0; i < cards; i++){ 
        backside = document.createElement("div");
        backside.className = 'card';
        board.appendChild(backside);
    }

or alternatively (shorter but less flexible, only use this for a one-off)

startBtn.onclick = function(){
    removeButton = document.getElementById("start");
    removeButton.parentNode.removeChild(removeButton);

    for(var i = 0; i < cards; i++){ 
        board.appendChild("<div class='card'></div>);
    }
Share:
17,344
Cammy
Author by

Cammy

Updated on June 13, 2022

Comments

  • Cammy
    Cammy almost 2 years

    I Googled a lot about creating multiple items with appendChild, but I’m not understanding how it works. My appendChild just replaces instead of adding many.

    var startGame;
    var cards = 16;
    var newDeck = [];
    
    startGame = function(){
        var startBtn = document.getElementById('start');
        var board = document.getElementById('game-board');
        var backside = document.createElement("div");
        backside.className = 'card';
    
        startBtn.onclick = function(){
            removeButton = document.getElementById("start");
            removeButton.parentNode.removeChild(removeButton);
    
            for(var i = 0; i < cards; i++){ 
                board.appendChild(backside);
            }
        };
    };
    

    I also read you can do this with innerHTML, but that leaves me confused as well. Does anyone have a more detailed explanation on how to make this work?