【问题标题】:Dynamically create a table from user input从用户输入动态创建表
【发布时间】:2012-12-28 13:41:56
【问题描述】:

我正在从表单中获取用户输入并尝试从该输入创建表。输入应确定行数和列数。我尝试了以下方法,但我什么也没得到。我有点难过。任何帮助表示赞赏。

JS

function makeChart(){
    var table = document.createElement("table");
    var taskName = document.getElementById("taskname").value + "</br>";
    var numDays = document.getElementById("days").value + "</br>";
    var howOften = document.getElementById("times").value + "</br>";
    var rows=table.insertRow(howOften);
    var cols=rows.insertCell(numDays);
    document.getElementById("holdTable").appendChild(table);
    table.appendChild(rows);
    table.appendChild(cols);
}

HTML

<div id="holdTable">
    <form id="chartInput">
        <label for="taskname">Task</label>
        <input id="taskname" type="text" placeholder="Enter the task name here"> <br>

        <label for="days">How many days</label>
        <input id="days" name="days" type="number" min="1" max="7"> <br>

        <label for="times">How many times a day</label>
        <input id="times" name="times" type="number" min="1" max="4"> <br>

        <input id="createChart" type="button" value="Make the chart" onClick="makeChart();"> <br>
    </form>
</div>

【问题讨论】:

  • 你打开错误控制台了吗?这是一个救命稻草,因为它可以报告 Javascript 通常会悄悄失败的错误。
  • 我正在使用 Eclipse,所以请登录。无法打开 keycharmap 文件和 JSCallback 错误。不知道这些是否相关。

标签: javascript tabular


【解决方案1】:

我认为你需要使用循环。

for(var i = 1;i<=howOften;i++)
{
    var row = table.insertRow(-1)
    for(var i = 1;i<=numDays;i++)
    {
        row.insertCell(-1)
    }
    table.appendChild(row);//edited
}

尝试用这个代替这 2 行:

var rows=table.insertRow(howOften);
var cols=rows.insertCell(numDays);

解释
insertRow 函数在括号中指定的索引位置插入新表行 (&lt;tr&gt;)。它只插入一行。因此,如果索引为 0,&lt;tr&gt; 将作为第一行附加到表的开头。同样,-1 将&lt;tr&gt; 附加为表中的最后一行。

insertCell 函数将单元格(&lt;td&gt;)插入行的索引位置(&lt;tr&gt;)。与上面相同 -1 表示它在行的最后一个位置添加新单元格。

每一行都必须附加到表中或存储在数组中以供以后使用,因此我添加了table.appendChild(row);,它将每个连续的行添加到数组中。

【讨论】:

  • 感谢 Dharman,我已按照建议添加了循环来代替这些行。据我了解,这将遍历值并创建输入的行数和次数(在第一个位置?)。我现在收到一个错误,指出未定义行。我想我需要创建一个行变量并更改 table.appendChild 行。
  • 加 1 用于了解用户想要什么并向他展示嵌套循环。不过,我确实认为您的回答可以提供更多信息和解释。
【解决方案2】:

table.insertRowtableRow.insertCell 将您希望插入的索引作为参数。相反,您正在传递一个字符串,其中包含附加到 HTML BR 标记的字段值(那是一种格式错误的标记)。

此外,要向元素添加文本,您需要使用 document.createTextNode 创建文本节点并将这些节点附加到相关元素。

最后,cols 应该是 rows 的子代,而不是 table 的子代。所以你的行,table.appendChild(cols) 也是错误的。

除了那些 cmets,我不能再进一步了。我不确定您在输出的表结构中到底在寻找什么。在我看来,你想要一行两列,但达曼的回答表明他读它就像你想要多行一样。考虑使用一些显示所需表格的标记来更新您的问题。

编辑:使用您的评论获取更多信息,我编写了以下代码演示供您尝试:http://jsfiddle.net/Kkb7n/。为了演示,我让它使用“任务名称”作为创建单元格的文本内容。

修改 JS 以防 JSFiddle 宕机:

var makeChart = function () {
    var table = document.createElement('table'),
        taskName = document.getElementById('taskname').value,
        numDays = document.getElementById('days').value, //columns
        howOften = document.getElementById('times').value, //rows
        row,
        r,
        col,
        c;

    for (r = 0; r < howOften; r++) {
        row = table.insertRow(-1);

        for (c = 0; c < numDays; c++) {
            col = row.insertCell(-1);
            col.appendChild(document.createTextNode(taskName));
        }
    }

    document.getElementById('holdTable').appendChild(table);
};

【讨论】:

  • 好的,谢谢。行数取决于用户输入的数字,列数取决于天数。我正在尝试获取这些值,将它们传递给表并生成它,所以我认为循环可能是我想要的。我会坚持下去。如果我有任何成功,我会回帖。
  • JAAulde,非常感谢您的提琴。这就是我想要做的。事实证明,我快到了,但是在比较你的代码和我的代码之后,我可以看到我是如何在循环中添加了一些额外的(这可能会破坏它),而你的设置效率更高。再次感谢。现在我只需要弄清楚如何允许用户将图像添加到节点。那应该很有趣!附言我试图投票,但没有足够的街头信誉!
  • 很高兴它有帮助。你应该能够接受我的回答或其他。我忘记了投票能力是什么时候开始的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2015-01-07
  • 1970-01-01
  • 2017-05-21
  • 2015-06-13
相关资源
最近更新 更多