【问题标题】:Insert multiple rows and columns to a table in html dynamically using javascript code使用javascript代码动态地将多行和多列插入到html中的表中
【发布时间】:2019-02-19 00:59:38
【问题描述】:

我正在尝试插入多行和多列以动态地在 html 中创建一个表,方法是使用 MS Word 中的 javascript 代码选择下拉列表中的行数和列数。 例如,如果我从数字下拉列表中选择行数为 5,列数为 5。应该显示 5 行和 5 列。

我的问题是如何通过从下拉列表中选择行数和列数来动态添加多行和多列来创建表格。

【问题讨论】:

  • 那么你的问题是什么?
  • jQuery 很好,或者你只需​​要 javascript

标签: javascript html html-table


【解决方案1】:

由于<table> 元素是HTML 中最复杂的结构之一,HTML DOM 提供了新的接口HTMLTableElement,它具有特殊的属性和方法来操作HTML 文档中表格的布局和表示。

所以,如果你想使用 DOM 标准实现预期的结果,你可以使用这样的东西:


HTML:

<ul>
    <li>
        <label for="column">Add a Column</label>
        <input type="number" id="column" />
    </li>
    <li>
        <label for="row">Add a Row</label>
        <input type="number" id="row" />
    </li>
    <li>
        <input type="button" value="Generate" id="btnGen" />
        <input type="button" value="Copy to Clipboard" id="copy" />
    </li>
</ul>
<div id="wrap"></div> 

JS 新:

JavaScript 得到了改进。

(function (window, document, undefined) {
    "use strict";

    var wrap = document.getElementById("wrap"),
        setColumn = document.getElementById("column"),
        setRow = document.getElementById("row"),
        btnGen = document.getElementById("btnGen"),
        btnCopy = document.getElementById("btnCopy");

    btnGen.addEventListener("click", generateTable);
    btnCopy.addEventListener("click", copyTo);

    function generateTable(e) {
        var newTable = document.createElement("table"),
            tBody = newTable.createTBody(),
            nOfColumns = parseInt(setColumn.value, 10),
            nOfRows = parseInt(setRow.value, 10),
            row = generateRow(nOfColumns);

        newTable.createCaption().appendChild(document.createTextNode("Generated Table"));

        for (var i = 0; i < nOfRows; i++) {
            tBody.appendChild(row.cloneNode(true));
        }

        (wrap.hasChildNodes() ? wrap.replaceChild : wrap.appendChild).call(wrap, newTable, wrap.children[0]);
    }

    function generateRow(n) {
        var row = document.createElement("tr"),
            text = document.createTextNode("cell");

        for (var i = 0; i < n; i++) {
            row.insertCell().appendChild(text.cloneNode(true));
        }

        return row.cloneNode(true);
    }

    function copyTo(e) {
        prompt("Copy to clipboard: Ctrl+C, Enter", wrap.innerHTML);
    }
}(window, window.document));

JS 旧版:

(function () {
    "use strict";

    var wrap = document.getElementById("wrap"),
        setColumn = document.getElementById("column"),
        setRow = document.getElementById("row"),
        btnGen = document.getElementById("btnGen"),
        copy = document.getElementById("copy"),
        nOfColumns = -1,
        nOfRows = -1;

    btnGen.addEventListener("click", generateTable);
    copy.addEventListener("click", copyTo);

    function generateTable(e) {
        var newTable = document.createElement("table"),
            caption = newTable.createCaption(),
            //tHead = newTable.createTHead(),
            //tFoot = newTable.createTFoot(),
            tBody = newTable.createTBody();

        nOfColumns = parseInt(setColumn.value, 10);
        nOfRows = parseInt(setRow.value, 10);

        caption.appendChild(document.createTextNode("Generated Table"));

        // appendRows(tHead, 1);
        // appendRows(tFoot, 1);
        appendRows(tBody);

        (wrap.hasChildNodes() ? wrap.replaceChild : wrap.appendChild).call(wrap, newTable, wrap.firstElementChild);
    }

    function appendColumns(tElement, count) {
        var cell = null,
            indexOfRow = [].indexOf.call(tElement.parentNode.rows, tElement) + 1,
            indexOfColumn = -1;

        count = count || nOfColumns;

        for (var i = 0; i < count; i++) {
            cell = tElement.insertCell(i);
            indexOfColumn = [].indexOf.call(tElement.cells, cell) + 1;
            cell.appendChild(document.createTextNode("Cell " + indexOfColumn + "," + indexOfRow));
        }
    }

    function appendRows(tElement, count) {
        var row = null;
        count = count || nOfRows;
        for (var i = 0; i < count; i++) {
            row = tElement.insertRow(i);
            appendColumns(row);
        }
    }

    function copyTo(e) {
        prompt("Copy to clipboard: Ctrl+C, Enter", wrap.innerHTML);
    }
}());  

如果您想将生成的结果复制到剪贴板,您可以查看Jarek Milewski - How to copy to the clipboard in JavaScript? 的答案

【讨论】:

    【解决方案2】:

    你可以使用这个函数来生成没有你想要的行和列的动态表:

    function createTable() {
        var a, b, tableEle, rowEle, colEle;
        var myTableDiv = document.getElementById("DynamicTable");
        a = document.getElementById('txtRows').value; //No of rows you want
        b = document.getElementById('txtColumns').value; //No of column you want
    
        if (a == "" || b == "") {
            alert("Please enter some numeric value");
        } else {
            tableEle = document.createElement('table');
            for (var i = 0; i < a; i++) {
                rowEle = document.createElement('tr');
    
                for (var j = 0; j < b; j++) {
                    colEle = document.createElement('td');
                    rowEle.appendChild(colEle);
                }
                tableEle.appendChild(rowEle);
            }
            $(myTableDiv).html(tableEle);
        }
    }
    

    【讨论】:

    • $(myTableDiv).html(tableEle); - 这是 jQuery 吗?
    • 所以一行代码就必须包含整个库?
    • 如果您不使用 jQuery,那么您可以通过 javascript 来完成。 myTableDiv.innerHTML = tableEle.
    • 不完全是,myTableDiv.innerHTML = tableEle.outerHTML 可以。
    【解决方案3】:

    试试这样的:

    var
        tds = '<td>Data'.repeat(col_cnt),
        trs = ('<tr>'+tds).repeat(row_cnt),
        table = '<table>' + trs + '</table>;
    

    然后将表格放入容器中:

    document.getElementById('tablePreviewArea').innerHTML = table;
    

    或者使用 JQuery:

    $('#tablePreviewArea').html(table);
    

    这里是JSFiddle using native js。 这是JSFiddle using jQuery

    关于字符串重复功能

    我从here得到了重复功能:

    String.prototype.repeat = function( num )
    {
        return new Array( num + 1 ).join( this );
    }
    

    【讨论】:

    • 这个真的需要jQuery吗?
    • 不错,谢谢 Pavlo。我添加了没有 jquery 的片段。
    【解决方案4】:

    我有一个示例代码...试试这个并根据您的要求进行修改。希望对你有帮助。

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
    <html>
        <head>
            <title>Untitled Document</title>
            <style type="text/css">
                #mytab td{
                    width:100px;
                    height:20px;
                    background:#cccccc;
                }
            </style>
            <script type="text/javascript">
                function addRow(){
                    var root=document.getElementById('mytab').getElementsByTagName('tbody')[0];
                    var rows=root.getElementsByTagName('tr');
                    var clone=cloneEl(rows[rows.length-1]);
                    root.appendChild(clone);
                }
                function addColumn(){
                    var rows=document.getElementById('mytab').getElementsByTagName('tr'), i=0, r, c, clone;
                    while(r=rows[i++]){
                        c=r.getElementsByTagName('td');
                        clone=cloneEl(c[c.length-1]);
                        c[0].parentNode.appendChild(clone);
                    }
                }
                function cloneEl(el){
                    var clo=el.cloneNode(true);
                    return clo;
                }
            </script>
    
        </head>
        <body>
            <form action="">
                <input type="button" value="Add a Row" onclick="addRow()">
                <input type="button" value="Add a Column" onclick="addColumn()">
            </form>
            <br>
    
            <table id="mytab" border="1" cellspacing="0" cellpadding="0">
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
            </table>
        </body>
    </html>
    

    您可以使用选择菜单代替按钮并将值传递给变量。它将根据值创建行、列。

    【讨论】:

    • 非常感谢。对我帮助很大。再次感谢。
    • @user3188826,如果它解决了您的问题,请尽可能接受答案。
    • @Pavlo 这个答案与这里的元标记无关,我不知道这里为什么是-1。它帮助了正在询问的人。如果您想了解有关 met 标签的信息,请转到链接 htmldog.com/guides/html/intermediate/metatags
    • 除了meta标签,代码乱七八糟,没有做任何解释。
    • 代码通俗易懂,不用解释,也许新格式的代码有助于看清楚
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 2015-07-21
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多