How to add multiple divs with appendChild?

前端 未结 4 551
挽巷
挽巷 2020-12-13 18:03

I am trying to make a chessboard using javascript and creating 64 divs with it.
The problem is, that it creates only the first div.
Here is the code:



        
相关标签:
4条回答
  • 2020-12-13 18:42
    function crt_dv(){
    dv=document.createElement('div'),document.body.appendChild(dv)
    };
    
    crt_dv(),dv.className='white';crt_dv(),dv.className='black';
    

    Also use: for(i=0;i<2;i++)

    0 讨论(0)
  • 2020-12-13 18:43

    Although what T.J. Crowder writes works fine, I would recommend rewriting it to the code below, using a documentFragment, like Renato Zannon suggested. That way you will only write to the DOM once.

        window.onload = function() {
            var count = 5,
                div,
                board = document.getElementById('board'),
                fragment = document.createDocumentFragment();
            
            // rows
            for (var i = 0; i < count; ++i) { 
    
                // columns
                for (var j = 0; j < count; ++j) { 
                    div = document.createElement('div');
                    div.className = (i % 2 != 0 && j % 2 == 0) || (i % 2 == 0 && j % 2 != 0) ? 'black' : 'white';
                    fragment.appendChild(div);
                }
            }
            
            board.appendChild(fragment);
        };
    #board {
      background-color: #ccc;
      height: 510px;
      padding: 1px;
      width: 510px;
    }
    
    .black,
    .white {
        float: left;
        height: 100px;
        margin: 1px;
        width: 100px;
    }
    
    .black {
      background-color: #333;
    }
    
    .white {
      background-color: #efefef;
    }
    <div id="board"></div>

    0 讨论(0)
  • 2020-12-13 18:55

    As t-j-crowder has noted, the OP's code only creates one div. But, for googlers, there is one way to append multiple elements with a single appendChild in the DOM: by creating a documentFragment.

    function createDiv(text) {
      var div = document.createElement("div");
      div.appendChild(document.createTextNode(text));
      return div;
    }
    
    var divs = [
      createDiv("foo"),
      createDiv("bar"),
      createDiv("baz")
    ];
    
    var docFrag = document.createDocumentFragment();
    for(var i = 0; i < divs.length; i++) {
      docFrag.appendChild(divs[i]); // Note that this does NOT go to the DOM
    }
    
    document.body.appendChild(docFrag); // Appends all divs at once
    
    0 讨论(0)
  • 2020-12-13 19:04

    The problem is, that it creates only the first div.

    Right, because you've only created one div. If you want to create more than one, you must call createElement more than once. Move your

    d=document.createElement("div");
    

    line into the j loop.

    If you call appendChild passing in an element that's already in the DOM, it's moved, not copied.

    window.onload=function()
        {
            var i=0;
            var j=0;
    
            for (i=1; i<=8; i++)
            {
                for (j=1; j<=8; j++)
                {
                    if ((i%2!=0 && j%2==0)||(i%2==0 && j%2!=0))
                    {
                        var d=document.createElement("div");
                        document.body.appendChild(d);
                        d.className="black";
                    }
                    else
                    {
                        var d=document.createElement("div");
                        document.body.appendChild(d);
                        d.className="white";
                    }
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题