在for循环中使用appendChild只会添加一个子元素。

18

我正在使用JavaScript和HTML表格创建一个类似于Photoshop中看到的网格。 网格大小会变化,即用户可以更改,因此必须计算每个网格正方形的大小并将其除以可用像素数以获得精确大小的网格。

我已经完成了这一切,但是在添加所需的表格元素来创建网格时出现了问题。我的代码完全正常工作,只有当我在for循环中使用appendChild()函数时,它只附加单个子项,而应该附加多达几百个。

我的代码:

grid.show = function(event)
{
    var e = event;

    if(grid.show_grid == false)
    {
        grid.show_grid = true;

        parent.document.getElementById("grid_table").style.display = "block";

        // Get grid (table) and create some elements.
        grid.get_grid = parent.document.getElementById("grid_table");
        grid.tr       = parent.document.createElement("tr");
        grid.td       = parent.document.createElement("td");

        // Clear the grid of all squares so we don't have to worry about subtracting anything.
        grid.get_grid.innerHTML = "";

        // Calculate the number of horizontal and vertical squares.
        var horizontal = Math.ceil(grid.total_width / grid.size);
        var vertical   = Math.ceil(grid.total_height / grid.size);

        // This was a nested loop, removed for demonstration.
        // Attempting to add 10 "<tr><td></td></tr>" to the table.
        for(var j = 0; j < 10; j++)
        {
            grid.tr.appendChild(grid.td);
        }

        //console.log(grid.tr);

        // Add the elements to the table.
        grid.get_grid.appendChild(grid.tr);

    }
    else
    {   
        grid.show_grid = false;
        parent.document.getElementById("grid_table").style.display = "none";
    }
}

这个函数只会返回一个包含单个数据的表格行,就像这样:

<tr>
    <td></td>
</tr>

我已经查看了这个页面这个页面,它们听起来很有希望,但我就是找不到如何让这个工作。

编辑:代码现在可用,解决方案:

grid.show = function(event)
{
    var e = event;

    if(grid.show_grid == false)
    {
        grid.show_grid = true;

        parent.document.getElementById("grid_table").style.display = "block";

        grid.get_grid           = parent.document.getElementById("grid_table");
        grid.tr                 = null;
        grid.td                 = null;
        grid.get_grid.innerHTML = "";

        var horizontal = Math.ceil(grid.total_width / grid.size);
        var vertical   = Math.ceil(grid.total_height / grid.size);

        for(var i = 0; i < vertical; i++)
        {
            grid.tr = parent.document.createElement("tr");

            for(var j = 0; j < horizontal; j++)
            {
                grid.td = parent.document.createElement("td");

                grid.td.width = grid.size;
                grid.td.height = grid.size;

                grid.tr.appendChild(grid.td);
            }
            grid.get_grid.appendChild(grid.tr);
        }
    }
    else
    {   
        grid.show_grid = false;
        parent.document.getElementById("grid_table").style.display = "none";
    }
}
3个回答

31

您一遍又一遍地添加同一个元素。您需要每次希望获得新元素时调用document.createElement

编辑:如果元素设置非常复杂并且可能包含子元素,则还可以使用Node.cloneNode


2
谢谢,这就是问题所在。代码现在按预期工作(解决方案在原帖中)。 - user1649326

15
如果您想复制一个元素,您需要克隆它。使用cloneNode()
因此更改:
grid.tr.appendChild(grid.td);

grid.tr.appendChild(grid.td.cloneNode(true));

5
for(var j = 0; j < 10; j++)
{
        grid.tr.appendChild(grid.td);
}

应该是

for(var j = 0; j < 10; j++) {
    var newTd = parent.document.createElement('td');
    grid.tds.push(newTd); // if you need it, not sure why though
    grid.tr.appendChild(newTd);
}

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