使用DOM动态创建表

hol*_*ard 27 javascript dom

有人能告诉我这段代码有什么问题吗?我想创建一个包含2列和3行的表,在单元格中我希望每行都有Text1和Text2.此代码创建一个包含2列和3行的表,但它只是第三行单元格中的文本(其他行为空).

var tablearea = document.getElementById('tablearea');

var table = document.createElement('table');

var tr = [];

var td1 = document.createElement('td');
var td2 = document.createElement('td');

var text1 = document.createTextNode('Text1');
var text2 = document.createTextNode('Text2');

for (var i = 1; i < 4; i++){
    tr[i] = document.createElement('tr');   
    for (var j = 1; j < 4; j++){
        td1.appendChild(text1);
        td2.appendChild(text2);
        tr[i].appendChild(td1);
        tr[i].appendChild(td2);
    }           
    table.appendChild(tr[i]);

}

tablearea.appendChild(table);
Run Code Online (Sandbox Code Playgroud)

Krz*_*tof 60

您必须在循环中创建td和文本节点.您的代码只创建了2个td,因此只有2个可见.例:

var table = document.createElement('table');
for (var i = 1; i < 4; i++){
    var tr = document.createElement('tr');   

    var td1 = document.createElement('td');
    var td2 = document.createElement('td');

    var text1 = document.createTextNode('Text1');
    var text2 = document.createTextNode('Text2');

    td1.appendChild(text1);
    td2.appendChild(text2);
    tr.appendChild(td1);
    tr.appendChild(td2);

    table.appendChild(tr);
}
document.body.appendChild(table);
Run Code Online (Sandbox Code Playgroud)


Rig*_*red 15

这是因为你只创建了两个td元素和两个文本节点.


在循环中创建所有节点

重新创建循环中的节点:

var tablearea = document.getElementById('tablearea'),
    table = document.createElement('table');

for (var i = 1; i < 4; i++) {
    var tr = document.createElement('tr');

    tr.appendChild( document.createElement('td') );
    tr.appendChild( document.createElement('td') );

    tr.cells[0].appendChild( document.createTextNode('Text1') )
    tr.cells[1].appendChild( document.createTextNode('Text2') );

    table.appendChild(tr);
}

tablearea.appendChild(table);
Run Code Online (Sandbox Code Playgroud)

然后在循环中创建然后克隆

事先创建它们,并在循环中克隆它们:

var tablearea = document.getElementById('tablearea'),
    table = document.createElement('table'),
    tr = document.createElement('tr');

tr.appendChild( document.createElement('td') );
tr.appendChild( document.createElement('td') );

tr.cells[0].appendChild( document.createTextNode('Text1') )
tr.cells[1].appendChild( document.createTextNode('Text2') );

for (var i = 1; i < 4; i++) {
    table.appendChild(tr.cloneNode( true ));
}

tablearea.appendChild(table);
Run Code Online (Sandbox Code Playgroud)

表工厂与文本字符串

做一个桌子工厂:

function populateTable(table, rows, cells, content) {
    if (!table) table = document.createElement('table');
    for (var i = 0; i < rows; ++i) {
        var row = document.createElement('tr');
        for (var j = 0; j < cells; ++j) {
            row.appendChild(document.createElement('td'));
            row.cells[j].appendChild(document.createTextNode(content + (j + 1)));
        }
        table.appendChild(row);
    }
    return table;
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

document.getElementById('tablearea')
        .appendChild( populateTable(null, 3, 2, "Text") );
Run Code Online (Sandbox Code Playgroud)

表工厂与文本字符串或回调

可以很容易地修改工厂以接受第四个参数的函数,以便以更动态的方式填充每个单元格的内容.

function populateTable(table, rows, cells, content) {
    var is_func = (typeof content === 'function');
    if (!table) table = document.createElement('table');
    for (var i = 0; i < rows; ++i) {
        var row = document.createElement('tr');
        for (var j = 0; j < cells; ++j) {
            row.appendChild(document.createElement('td'));
            var text = !is_func ? (content + '') : content(table, i, j);
            row.cells[j].appendChild(document.createTextNode(text));
        }
        table.appendChild(row);
    }
    return table;
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

document.getElementById('tablearea')
        .appendChild(populateTable(null, 3, 2, function(t, r, c) {
                        return ' row: ' + r + ', cell: ' + c;
                     })
        );
Run Code Online (Sandbox Code Playgroud)