如何使用appendChild添加多个div?

47

我正在尝试使用JavaScript创建一个棋盘,并使用64个div来实现。
问题是它只创建了第一个div。
以下是代码:

div {
    width: 50px;
    height: 50px;

    display: block;
    position: relative;
    float: left;
}

<script type="text/javascript">
    window.onload=function()
    {
        var i=0;
        var j=0;
        var d=document.createElement("div");

        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))
                {
                    document.body.appendChild(d);
                    d.className="black";
                }
                else
                {
                    document.body.appendChild(d);
                    d.className="white";
                }
            }
        }
    }
</script>
4个回答

78

正如t-j-crowder所指出的那样,原帖中的代码只创建了一个div。但是,对于谷歌搜索者来说,在DOM中有一种使用单个appendChild添加多个元素的方法:通过创建一个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

有趣的,我也会试试这个。 - svtslvskl
11
在添加多个元素时,您应该始终使用documentFragmentdocumentFragment充当一个暂存区,在其中重复添加元素,最后再将其添加到DOM中。重复向DOM添加元素会导致整个文档重新布局。请参见:http://ejohn.org/blog/dom-documentfragments/。 - Ram Patra

33

问题是,它只创建了第一个 div。

没错,因为你只创建了一个 div。如果你想要创建多个,你必须多次调用 createElement。将你的

d=document.createElement("div");

line插入到j循环中。

如果你调用appendChild并传入一个已经存在于DOM中的元素,它会被移动而不是复制。

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";
                }
            }
        }
    }

@SvyatoslavSykalo:不错的交易,很高兴能帮上忙! - T.J. Crowder
3
注意:这种方法每次调用appendChild()都会导致页面重新布局(计算元素的位置和几何形状)。使用documentFragment(见下文)批量添加子元素。 - stevemao

12

虽然T.J. Crowder的代码能正常工作,但我建议使用文档片段(documentFragment)重写代码,就像Renato Zannon建议的那样。这样你只需要向DOM写入一次。

    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>


1
function crt_dv(){
dv=document.createElement('div'),document.body.appendChild(dv)
};

crt_dv(),dv.className='white';crt_dv(),dv.className='black';

另外使用:for(i=0;i<2;i++)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接