JS (template Literal-) 生成 html,更新 DOM?
JS (template Literal-) generated html, updates the DOM?
当用 JavaScript 生成 HTML 时,使用烦人的冗长是不是更好
document.createElement("p")
...
(如此处所示:https://www.w3schools.com/jsref/met_document_createelement.asp)
还是使用模板文字(反引号)更好?
`<p></p>`
我不确定模板文字是否会更新 DOM 并且我假设 createElement() 会更新?
而且我不知道如何测试它。
示例代码:
<body>
<div id="myDIV"></div>
<script>
let theDiv = document.getElementById("myDIV");
function verboseGeneration(){
var para = document.createElement("P");
para.innerHTML = "This is a paragraph.";
theDiv.insertAdjacentElement("beforeend", para);
}
function TemplateLiteralGeneration(){
theDiv.insertAdjacentHTML("beforeend", `<p>This is a paragraph.</p>`)
}
verboseGeneration();
TemplateLiteralGeneration();
</script>
</body>
预期结果:相等。
实际结果:未知,因为我不知道如何测试它与 HTML DOM.
的交互方式
(我计划基于一些数组生成一个大的 table,我犹豫是否使用模板文字,以防它们不更新或不能与 DOM,它会在未来产生奇怪的问题。)
这取决于您要对生成的标记执行的操作。如果你想执行操作,遍历片段,那么你最好创建一个元素作为节点(使用 document.createElement()
),而不是使用纯字符串。
正如您提到的,您正在生成一个大的 table,实际创建一个 document fragment 来保存您的大 table,然后将整个片段附加到空白 <table>
元素中。
这是一个示例:我想迭代创建一个 table,它有 10 列宽和 20 行高。如果你选择用普通字符串构造整个table,字符串会变得很长,而且你不能想遍历创建的table。
下面的示例显示了使用 document.createElement()
和片段的强大功能:我可以通过遍历标记来追溯地将新样式和逻辑应用于标记。你不能用纯字符串来做到这一点。在这种情况下,我选择重新访问最后的 table,并有条件地突出显示其中包含偶数的单元格:
const fragment = document.createDocumentFragment();
const columns = 10;
const rows = 20;
// Create table header
const header = document.createElement('thead');
const headerRow = document.createElement('tr');
for (let i = 0; i < columns; i++) {
const headerCell = document.createElement('th');
headerCell.innerHTML = `Col ${i + 1}`;
headerRow.appendChild(headerCell);
}
header.appendChild(headerRow);
// Append header to table
fragment.appendChild(header);
// Create table body
const body = document.createElement('tbody');
for (let i = 0; i < rows; i++) {
const bodyRow = document.createElement('tr');
for (let j = 0; j < columns; j++) {
const bodyCell = document.createElement('td');
bodyCell.innerHTML = i + j + 1;
bodyRow.appendChild(bodyCell);
}
body.appendChild(bodyRow);
}
// Append body to table
fragment.appendChild(body);
// Here's the advantage of storing your markup as node/elements
// You can traverse through the fragment if you want!
// Let's say I want to highlight all even numbers
const allCells = fragment.querySelectorAll('tbody td');
Array.from(allCells).forEach(cell => {
const n = +cell.innerHTML;
if (n % 2 === 0) {
cell.classList.add('highlight');
}
});
document.getElementById('my-table').appendChild(fragment);
table th,
table td {
border: 1px solid #ccc;
}
.highlight {
background-color: yellow;
}
<table id="my-table"></table>
当用 JavaScript 生成 HTML 时,使用烦人的冗长是不是更好
document.createElement("p")
...
(如此处所示:https://www.w3schools.com/jsref/met_document_createelement.asp)
还是使用模板文字(反引号)更好?
`<p></p>`
我不确定模板文字是否会更新 DOM 并且我假设 createElement() 会更新?
而且我不知道如何测试它。
示例代码:
<body>
<div id="myDIV"></div>
<script>
let theDiv = document.getElementById("myDIV");
function verboseGeneration(){
var para = document.createElement("P");
para.innerHTML = "This is a paragraph.";
theDiv.insertAdjacentElement("beforeend", para);
}
function TemplateLiteralGeneration(){
theDiv.insertAdjacentHTML("beforeend", `<p>This is a paragraph.</p>`)
}
verboseGeneration();
TemplateLiteralGeneration();
</script>
</body>
预期结果:相等。
实际结果:未知,因为我不知道如何测试它与 HTML DOM.
的交互方式(我计划基于一些数组生成一个大的 table,我犹豫是否使用模板文字,以防它们不更新或不能与 DOM,它会在未来产生奇怪的问题。)
这取决于您要对生成的标记执行的操作。如果你想执行操作,遍历片段,那么你最好创建一个元素作为节点(使用 document.createElement()
),而不是使用纯字符串。
正如您提到的,您正在生成一个大的 table,实际创建一个 document fragment 来保存您的大 table,然后将整个片段附加到空白 <table>
元素中。
这是一个示例:我想迭代创建一个 table,它有 10 列宽和 20 行高。如果你选择用普通字符串构造整个table,字符串会变得很长,而且你不能想遍历创建的table。
下面的示例显示了使用 document.createElement()
和片段的强大功能:我可以通过遍历标记来追溯地将新样式和逻辑应用于标记。你不能用纯字符串来做到这一点。在这种情况下,我选择重新访问最后的 table,并有条件地突出显示其中包含偶数的单元格:
const fragment = document.createDocumentFragment();
const columns = 10;
const rows = 20;
// Create table header
const header = document.createElement('thead');
const headerRow = document.createElement('tr');
for (let i = 0; i < columns; i++) {
const headerCell = document.createElement('th');
headerCell.innerHTML = `Col ${i + 1}`;
headerRow.appendChild(headerCell);
}
header.appendChild(headerRow);
// Append header to table
fragment.appendChild(header);
// Create table body
const body = document.createElement('tbody');
for (let i = 0; i < rows; i++) {
const bodyRow = document.createElement('tr');
for (let j = 0; j < columns; j++) {
const bodyCell = document.createElement('td');
bodyCell.innerHTML = i + j + 1;
bodyRow.appendChild(bodyCell);
}
body.appendChild(bodyRow);
}
// Append body to table
fragment.appendChild(body);
// Here's the advantage of storing your markup as node/elements
// You can traverse through the fragment if you want!
// Let's say I want to highlight all even numbers
const allCells = fragment.querySelectorAll('tbody td');
Array.from(allCells).forEach(cell => {
const n = +cell.innerHTML;
if (n % 2 === 0) {
cell.classList.add('highlight');
}
});
document.getElementById('my-table').appendChild(fragment);
table th,
table td {
border: 1px solid #ccc;
}
.highlight {
background-color: yellow;
}
<table id="my-table"></table>