如果您可以避免使用元素,只需将字符串放入 an 中,innerHTML
您将获得最佳性能。以下是创建表的一些不同方法。
我们可以创建一些函数来生成我们的 HTML。此代码将非常快(但可能更快)。我们将为所有这些示例假设这些数据。
var heading = ['Name', 'Points'];
var data = [
["Joe", 50],
["Jack", 80],
["Doug <b>'the hammer'</b> Jones", 76]
];
然后我们可以像这样生成我们的表,
document.body.innerHTML = table(heading, data);
function wrapTag(tag, html) {
return "<" + tag + ">" + html + "</" + tag + ">";
}
function table(head, body) {
return wrapTag("table", thead(head)
+ tbody(body));
}
function thead(head) {
var _th = head.map(wrapTag.bind(null, "th"));
var _tr = wrapTag("tr", _th.join("\n"));
return wrapTag("thead", _tr);
}
function tbody(body) {
return body.map(tr).join("\n");
}
function tr(row) {
var _td = row.map(wrapTag.bind(null, "td"));
return wrapTag("tr", _td.join("\n"));
}
KnockoutJS演示
在 Knockout 中,我们可以给它一个对象,并让它直接映射到我们的 HTML。使用上面定义的heading
和data
变量,我们像这样映射它。
ko.applyBindings({heading: heading, data: data});
我们的 HTML 使用foreach
了对数组进行迭代的绑定。 $data
指当前数组项。
<table>
<thead>
<tr data-bind="foreach: heading">
<th data-bind="text: $data"></th>
</tr>
</thead>
<tbody data-bind="foreach: data">
<tr data-bind="foreach: $data">
<td data-bind="html: $data"></td>
</tr>
</tbody>
</table>
AngularJS演示
使用上面的相同数据,我们可以创建一个 AngularJS 控制器。
function MyTableCtrl($scope) {
$scope.heading = heading;
$scope.data = data;
}
我们的 HTML 类似于 KnockoutJS。一个区别是循环语法,它允许我们命名我们的元素,例如,,row in data
而不是引用元素作为$data
。
<table ng-controller="MyTableCtrl">
<thead>
<tr>
<th ng-repeat="head in heading">{{head}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in data">
<td ng-repeat="content in row" ng-bind-html-unsafe="content"></td>
</tr>
</tbody>
</table>
归功于@Ian
这比常规的 DOM 操作更快,并且提供比组合字符串更好的语法。
newTable = createTable(heading, data);
document.body.appendChild(newTable);
function createTable(h, c) {
var frag, table, head, body;
frag = document.createDocumentFragment();
table = document.createElement("table");
head = createHeader(h);
body = createContent(c);
table.appendChild(head);
table.appendChild(body);
frag.appendChild(table);
return frag.cloneNode(true);
}
function createHeader(data) {
var thead, rowEl, col, colEl, text, i, j;
thead = document.createElement("thead")
rowEl = document.createElement("tr");
for (i = 0, j = data.length; i < j; i++) {
col = data[i];
colEl = document.createElement("td");
text = document.createTextNode(col);
colEl.appendChild(text);
rowEl.appendChild(colEl);
}
thead.appendChild(rowEl);
return thead;
}
function createContent(data) {
var content, row, rowEl, col, colEl, text, i, j, k, l;
content = document.createElement("tbody");
for (i = 0, j = data.length; i < j; i++) {
row = data[i];
rowEl = document.createElement("tr");
for (k = 0, l = row.length; k < l; k++) {
col = row[k];
colEl = document.createElement("td");
text = document.createTextNode(col);
colEl.appendChild(text);
rowEl.appendChild(colEl);
}
content.appendChild(rowEl);
}
return content;
}