【发布时间】:2013-03-29 18:55:08
【问题描述】:
背景和设置
我正在尝试从 javascript 中的表格数据创建一个表格,但是当我尝试将行插入到表格元素中时,它以与我期望的相反的顺序插入,并且与使用 @987654326 得到的相反的顺序插入@。 (这里是a jsfiddle with a live demo)。
假设我有一些这样的数据:
var data = [
{"a": 1, "b": 2, "c": 3},
{"a": 4, "b": 5, "c": 6},
{"a": 7, "b": 8, "c": 9}
], keys = ["a", "b", "c"];
如果我尝试使用insertRow() 和insertCell() 方法创建表,迭代上面的数据和键。我得到了我期望的相反顺序:
使用以下代码生成:
// insert a table into the DOM
var insertTable = insertDiv.appendChild(document.createElement("table")),
thead = insertTable.createTHead(), // thead element
thRow = thead.insertRow(), // trow element
tbody = insertTable.createTBody(); // tbody element
thRow.insertCell().innerText = "#"; // add row header
// insert columns
for (var i = 0, l = keys.length; i < l; i ++) {
var k = keys[i];
thRow.insertCell().innerText = k;
}
// insert rows of data
for (var i = 0, l = data.length; i < l; i ++) {
var rowData = data[i],
row = tbody.insertRow();
row.insertCell().innerText = i;
for (var j = 0, l = keys.length; j < l; j ++) {
var elem = rowData[keys[j]];
row.insertCell().innerText = elem;
}
}
然而,如果我使用 document.createElement 和 appendChild 创建一个表,我会得到我期望的顺序:
生成者:
// now do the same thing, but using appendChild
var byChildTable = document.createElement("table");
byChildTable.setAttribute("class", "table");
thead = byChildTable.appendChild(document.createElement("thead"));
thRow = thead.appendChild(document.createElement("tr"));
// create table header
thRow.appendChild(document.createElement("td")).innerText = "#";
for (var i = 0, l = keys.length; i < l; i ++) {
var key = keys[i];
thRow.appendChild(document.createElement("td")).innerText = key;
}
// insert table data by row
tbody = byChildTable.appendChild(document.createElement("tbody"));
for (var i = 0, l = data.length; i < l; i ++) {
var rowData = data[i],
row = tbody.appendChild(document.createElement("tr"));
row.appendChild(document.createElement("td")).innerText = i;
for (var j = 0, l = keys.length; j < l; j ++) {
var elem = rowData[keys[j]];
row.appendChild(document.createElement("td")).innerText = elem;
}
}
问题
如何控制将元素放入 DOM 的顺序?有什么办法可以改变这个吗?我想否则我可以以相反的顺序迭代,但即使这样,你仍然不能插入table.insertRow()。这只是一个遗憾,因为insertRow() 和insertCell() 方法似乎比table.appendChild(document.createElement("tr")) 等更清晰。
【问题讨论】:
-
insertRow()将索引作为参数,以便您可以选择放置新插入行的位置。 developer.mozilla.org/en-US/docs/DOM/table.insertRow -
哇——我现在觉得有点傻——我想我只是在 MDN 上错过了。谢谢大家!
-
仅供参考,您使用的某些方法在 Firefox 中不起作用。我认为您需要
.appendChild()而不是.createTBody()和.createTHead()。此外,如果您没有在insertCell()和.insertRow()中包含索引,Firefox 会抛出错误。 -
@amnotiam 谢谢,很高兴知道。显然
appendChild方法也更快。 -
@JeffTratner:不客气。此外,Firefox 不支持非标准的
.innerText。标准属性是.textContent。 IE8及以下需要.innerText,所以如果你支持这些浏览器,我会在你的应用程序顶部做一个这样的变量:var text = ("textContent" in document) ? "textContent" : "innerText";,然后用它来获取和设置文本。row.insertCell(-1)[text] = k;这是一个完整的工作版本:jsfiddle.net/ZfqRu
标签: javascript html dom html-table