【问题标题】:Dynamic creation of table with DOM使用 DOM 动态创建表
【发布时间】:2012-01-08 06:50:54
【问题描述】:

谁能告诉我这段代码有什么问题?我想创建一个包含 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);

【问题讨论】:

标签: javascript dom


【解决方案1】:

您必须在循环中创建 td 和 text 节点。您的代码仅创建 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);

【讨论】:

    【解决方案2】:

    您需要为每一列创建新的 TextNode 和 td 节点,而不是像您的代码那样在所有列中重复使用它们。

    编辑: 像这样修改你的代码:

    for (var i = 1; i < 4; i++)
    {
       tr[i] = document.createElement('tr');   
          var td1 = document.createElement('td');
          var td2 = document.createElement('td');
          td1.appendChild(document.createTextNode('Text1'));
          td2.appendChild(document.createTextNode('Text2'));
          tr[i].appendChild(td1);
          tr[i].appendChild(td2);
      table.appendChild(tr[i]);
    }
    

    【讨论】:

    • 感谢您的回答!当我尝试您的代码时,它会创建 6 列(和 3 行)?
    • 你不需要内部循环。
    • @JasonCraig 这就是我复制粘贴所得到的。我为你做了改变。
    • @Mathletics 你是绝对正确的。我只是匆忙复制了他的基本代码,而没有考虑删除那个循环。 =P
    【解决方案3】:

    这是因为您只创建了两个 td 元素和 2 个文本节点。


    循环创建所有节点

    在循环中重新创建节点:

    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);
    

    循环创建然后克隆

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

    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);
    

    带有文本字符串的表格工厂

    制作表格工厂:

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

    并像这样使用它:

    document.getElementById('tablearea')
            .appendChild( populateTable(null, 3, 2, "Text") );
    

    带有文本字符串或回调的表格工厂

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

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

    这样使用:

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

    【讨论】:

      【解决方案4】:

      当您说“appendchild”时,实际上是将您的孩子从一个父母转移到另一个父母。 您必须为每个单元格创建一个节点。

      【讨论】:

        【解决方案5】:
        <title>Registration Form</title>
        <script>
            var table;
        
            function check() {
                debugger;
                var name = document.myForm.name.value;
                if (name == "" || name == null) {
                    document.getElementById("span1").innerHTML = "Please enter the Name";
                    document.myform.name.focus();
                    document.getElementById("name").style.border = "2px solid red";
                    return false;
                }
                else {
                    document.getElementById("span1").innerHTML = "";
                    document.getElementById("name").style.border = "2px solid green";
                }
        
                var age = document.myForm.age.value;
                var ageFormat = /^(([1][8-9])|([2-5][0-9])|(6[0]))$/gm;
        
                if (age == "" || age == null) {
                    document.getElementById("span2").innerHTML = "Please provide Age";
                    document.myForm.age.focus();
                    document.getElementById("age").style.border = "2px solid red";
                    return false;
                }
                else if (!ageFormat.test(age)) {
                    document.getElementById("span2").innerHTML = "Age can't be leass than 18 and greater than 60";
                    document.myForm.age.focus();
                    document.getElementById("age").style.border = "2px solid red";
                    return false;
                }
                else {
                    document.getElementById("span2").innerHTML = "";
                    document.getElementById("age").style.border = "2px solid green";
                }
        
                var password = document.myForm.password.value;
                if (document.myForm.password.length < 6) {
                    alert("Error: Password must contain at least six characters!");
                    document.myForm.password.focus();
                    document.getElementById("password").style.border = "2px solid red";
                    return false;
                }
                re = /[0-9]/g;
                if (!re.test(password)) {
                    alert("Error: password must contain at least one number (0-9)!");
                    document.myForm.password.focus();
                    document.getElementById("password").style.border = "2px solid red";
                    return false;
                }
                re = /[a-z]/g;
                if (!re.test(password)) {
                    alert("Error: password must contain at least one lowercase letter (a-z)!");
                    document.myForm.password.focus();
                    document.getElementById("password").style.border = "2px solid red";
                    return false;
                }
                re = /[A-Z]/g;
                if (!re.test(password)) {
                    alert("Error: password must contain at least one uppercase letter (A-Z)!");
                    document.myForm.password.focus();
                    document.getElementById("password").style.border = "2px solid red";
                    return false;
                }
                re = /[$&+,:;=?@#|'<>.^*()%!-]/g;
                if (!re.test(password)) {
                    alert("Error: password must contain at least one special character!");
                    document.myForm.password.focus();
                    document.getElementById("password").style.border = "2px solid red";
                    return false;
                }
                else {
                    document.getElementById("span3").innerHTML = "";
                    document.getElementById("password").style.border = "2px solid green";
        
                }
        
                if (document.getElementById("data") == null)
                    createTable();
                else {
                    appendRow();
                }
                return true;
            }
        
        
        
        
        
        
            function createTable() {
        
                var myTableDiv = document.getElementById("myTable");  //indiv
                table = document.createElement("TABLE");   //TABLE??
                table.setAttribute("id", "data");
                table.border = '1';
                myTableDiv.appendChild(table);  //appendChild() insert it in the document (table --> myTableDiv)
                debugger;
        
                var header = table.createTHead();
        
                var th0 = table.tHead.appendChild(document.createElement("th"));
                th0.innerHTML = "Name";
                var th1 = table.tHead.appendChild(document.createElement("th"));
                th1.innerHTML = "Age";
        
        
                appendRow();
        
            }
        
            function appendRow() {
                var name = document.myForm.name.value;
                var age = document.myForm.age.value;
        
        
                var rowCount = table.rows.length;
                var row = table.insertRow(rowCount);
        
                row.insertCell(0).innerHTML = name;
                row.insertCell(1).innerHTML = age;
        
        
        
                clearForm();
        
        
            }
        
        
            function clearForm() {
                debugger;
        
                document.myForm.name.value = "";
                document.myForm.password.value = "";
                document.myForm.age.value = "";
        
        
        
            }
            function restrictCharacters(evt) {
        
                evt = (evt) ? evt : window.event;
                var charCode = (evt.which) ? evt.which : evt.keyCode;
                if (((charCode >= '65') && (charCode <= '90')) || ((charCode >= '97') && (charCode <= '122')) || (charCode == '32')) {
                    return true;
                }
                else {
                    return false;
                }
            }
        
        </script>
        
        
        
        <div>
            <form name="myForm">
        
                <table id="tableid">
        
                    <tr>
                        <th>Name</th>
                        <td>
                            <input type="text" name="name" placeholder="Name" id="name" onkeypress="return restrictCharacters(event);" /></td>
                        <td><span id="span1"></span></td>
                    </tr>
        
                    <tr>
                        <th>Age</th>
        
                        <td>
                            <input type="text" onkeypress="return event.charCode === 0 || /\d/.test(String.fromCharCode(event.charCode));" placeholder="Age"
                                name="age" id="age" /></td>
                        <td><span id="span2"></span></td>
                    </tr>
        
                    <tr>
                        <th>Password</th>
                        <td>
                            <input type="password" name="password" id="password" placeholder="Password" /></td>
                        <td><span id="span3"></span></td>
                    </tr>
        
        
                    <tr>
                        <td></td>
                        <td>
                            <input type="button" value="Submit" onclick="check();" /></td>
                        <td>
                            <input type="reset" name="Reset" /></td>
                    </tr>
        
                </table>
            </form>
        
            <div id="myTable">
            </div>
        
        </div>
        

        【讨论】:

        • 回答一个看似简单的问题的代码很多。你能解释一下它的作用以及它是如何解决问题的吗?它完全与问题有关吗?
        【解决方案6】:

        在我的示例中,序列号是根据使用 css 对每一行执行的操作进行管理的。我在每一行中使用了一个表单,当创建新行时,表单将被重置。

        /*auto increment/decrement the sr.no.*/
        body {
            counter-reset: section;
        }
        
        i.srno {
            counter-reset: subsection;
        }
        
        i.srno:before {
            counter-increment: section;
            content: counter(section);
        }
        /****/
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <script type='text/javascript'>
            $(document).ready(function () {
                $('#POITable').on('change', 'select.search_type', function (e) {
                    var selectedval = $(this).val();
                    $(this).closest('td').next().html(selectedval);
                });
            });
        </script>
        <table id="POITable" border="1">
            <tr>
                <th>Sl No</th>
                <th>Name</th>
                <th>Your Name</th>
                <th>Number</th>
                <th>Input</th>
                <th>Chars</th>
                <th>Action</th>
            </tr>
            <tr>
                <td><i class="srno"></i></td>
                <td>
                    <select class="search_type" name="select_one">
                        <option value="">Select</option>
                        <option value="abc">abc</option>
                        <option value="def">def</option>
                        <option value="xyz">xyz</option>
                    </select>
                </td>
                <td></td>
                <td>
                    <select name="select_two" >
                        <option value="">Select</option>
                        <option value="123">123</option>
                        <option value="456">456</option>
                        <option value="789">789</option>
                    </select>
                </td>
        
                <td><input type="text" size="8"/></td>
                <td>
                    <select name="search_three[]" >
                        <option value="">Select</option>
                        <option value="one">1</option>
                        <option value="two">2</option>
                        <option value="three">3</option>
                    </select>
                </td>
                <td><button type="button" onclick="deleteRow(this)">-</button><button type="button" onclick="insRow()">+</button></td>
            </tr>
        </table>
        
        <script type='text/javascript'>
            function deleteRow(row)
            {
                var i = row.parentNode.parentNode.rowIndex;
                document.getElementById('POITable').deleteRow(i);
            }
            function insRow()
            {
                var x = document.getElementById('POITable');
                var new_row = x.rows[1].cloneNode(true);
                var len = x.rows.length;
                //new_row.cells[0].innerHTML = len; //auto increment the srno
                var inp1 = new_row.cells[1].getElementsByTagName('select')[0];
                inp1.id += len;
                inp1.value = '';
                new_row.cells[2].innerHTML = '';
                new_row.cells[4].getElementsByTagName('input')[0].value = "";
                x.appendChild(new_row);
            }
        </script>

        希望这会有所帮助。

        【讨论】:

          【解决方案7】:
          var html = "";
              for (var i = 0; i < data.length; i++){
              html +="<tr>"+
                      "<td>"+ (i+1) + "</td>"+
                      "<td>"+ data[i].name + "</td>"+
                      "<td>"+ data[i].number + "</td>"+
                      "<td>"+ data[i].city + "</td>"+
                      "<td>"+ data[i].hobby + "</td>"+
                      "<td>"+ data[i].birthdate + "</td>"+"<td><button data-arrayIndex='"+ i +"' onclick='editData(this)'>Edit</button><button data-arrayIndex='"+ i +"' onclick='deleteData()'>Delete</button></td>"+"</tr>";
          }
          $("#tableHtml").html(html);
          

          【讨论】:

            【解决方案8】:

            在我的示例中,从按钮单击事件调用添加函数,然后从表单控件获取值并调用函数 generateTable。
            在 generateTable 函数中检查第一个表是否已生成。如果表未定义,则调用 generateHeader 函数和生成表头,然后调用 addToRow 函数在表中添加新行。

            <input type="button" class="custom-rounded-bttn bttn-save" value="Add" id="btnAdd" onclick="add()">
            
            
            <div class="row">
                <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
                    <div class="dataGridForItem">
                    </div>
                </div>
            </div>
            
            //Call Function From Button click Event
            
            var counts = 1;
            function add(){ 
                var Weightage = $('#Weightage').val();
                var ItemName = $('#ItemName option:selected').text();  
                var ItemNamenum = $('#ItemName').val();
                generateTable(Weightage,ItemName,ItemNamenum);
                 $('#Weightage').val('');
                 $('#ItemName').val(-1);
                 return true;
             } 
            
            
            function generateTable(Weightage,ItemName,ItemNamenum){
                var tableHtml = '';
                if($("#rDataTable").html() == undefined){
                    tableHtml = generateHeader();
                }else{
                    tableHtml = $("#rDataTable");
                } 
                var temp = $("<div/>");
                var row = addToRow(Weightage,ItemName,ItemNamenum);
                $(temp).append($(row));
                $("#dataGridForItem").html($(tableHtml).append($(temp).html()));
            }
            
            
            //Generate Header
            
            
            function generateHeader(){
                    var html = "<table id='rDataTable' class='table table-striped'>";
                    html+="<tr class=''>";
                    html+="<td class='tb-heading ui-state-default'>"+'Sr.No'+"</td>";
                    html+="<td class='tb-heading ui-state-default'>"+'Item Name'+"</td>";
                    html+="<td class='tb-heading ui-state-default'>"+'Weightage'+"</td>";
                    html+="</tr></table>";
                    return html; 
            }
            
            //Add New Row
            
            
            function addToRow(Weightage,ItemName,ItemNamenum){
                var html="<tr class='trObj'>";
                html+="<td>"+counts+"</td>";
                html+="<td>"+ItemName+"</td>";
                html+="<td>"+Weightage+"</td>";
                html+="</tr>";
                counts++;
                return html;
            }
            

            【讨论】:

              【解决方案9】:

              您可以创建如下动态表行:

              var tbl = document.createElement('table');
              tbl.style.width = '100%';
              
              for (var i = 0; i < files.length; i++) {
              
                      tr = document.createElement('tr');
              
                      var td1 = document.createElement('td');
                      var td2 = document.createElement('td');
                      var td3 = document.createElement('td');
              
                      ::::: // As many <td> you want
              
                      td1.appendChild(document.createTextNode());
                      td2.appendChild(document.createTextNode());
                      td3.appendChild(document.createTextNode();
              
                      tr.appendChild(td1);
                      tr.appendChild(td2);
                      tr.appendChild(td3);
              
                      tbl.appendChild(tr);
              }
              

              【讨论】:

                猜你喜欢
                • 2012-03-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-04-29
                • 2021-06-30
                • 1970-01-01
                相关资源
                最近更新 更多