如何使用JavaScript附加HTML代码



我正在尝试使用JavaScript向DOM添加一个元素。我有一个ul,我想添加一个li。使用appendChild没有什么困难,但我希望我的li更复杂。

这就是我试图实现的输出:

<li>
<span class="author">Me</span>
<span class="message">Message...</span>
<span class="time">
<div class="line"></div>
15:21
</span>
</li>
let author = "me";
let message = "Message...";
let time = "15:21";

正如你所看到的,我试图实现的不仅仅是一个带有一些文本(innerHTML(的基本li,而是相当大的HTML代码块。

我的问题是如何使用JavaScript来获得这个输出。或者我应该使用一些JavaScript库或其他东西来简化它吗?

看看我们附加到DOM的代码的原始链接。然后,您可以使用字符串插值将变量添加到代码中,如下面的

function appendHtml(el, str) {
var div = document.createElement('div'); //container to append to
div.innerHTML = str;
while (div.children.length > 0) {
el.appendChild(div.children[0]);
}
}
let author = "me";
let message = "Message...";
let time = "15:21";
var html = `<li><span class="author">${author}</span><span class="message">${message}</span><span class="time"><div class="line"></div>${time}</span></li>`;
appendHtml(document.body, html);

如果您想插入html元素字符串作为html节点,您必须创建用于appendChild()的html元素

但是,如果以字符串形式传递,insertAdjacentHTML()允许添加html元素。https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML

let author = "me";
let message = "Message...";
let time = "15:21";
let str = `<li><span class="author">${author}</span><span class="message">${message}</span><span class="time"><div class="line"></div>${time}</span></li>`;
document.querySelector('#nav').insertAdjacentHTML('beforeend', str);
<ul id='nav'><ul>

let html = `<li>
<span class="author">Me</span>
<span class="message">Message...</span>
<span class="time">
<div class="line"></div>
15:21
</span>
</li>`;
document.querySelector('#list').insertAdjacentHTML('beforeend', html);
<ul id='list'></ul>

您可以使用模板文字和insertAdjacentHTML来实现干净的方法。

function createListItem({ author, message, time }) {
return `<li>
<span class="author">${author}</span>
<span class="message">${message}</span>
<span class="time">
<div class="line"></div>
${time}
</span>
</li>`;
}
const ul = document.querySelector('ul');
ul.insertAdjacentHTML('beforeend', createListItem({
author: 'me',
message: 'Message...',
time: '15:21'
}));
.line { display: inline };
<ul>
<li>Current</li>
</ul>

更简单,(对我来说(

const DomParser = new DOMParser()
function makeLI( author, message, time)
{
let ElemLI =
`<li>
<span class="author">${author}</span>
<span class="message">${message}</span>
<span class="time">
<div class="line"></div>
${time}
</span>
</li>`
return (DomParser.parseFromString( ElemLI, 'text/html')).body.firstChild
}
// proof...
myList.appendChild(makeLI('you','Message...','15:21'))
myList.appendChild(makeLI('me','someone in ?','21:25'))
<ul id="myList"></ul>

这里有一个你可以使用的小技巧。

实际上,您可以使用现有的DOM(HTML(作为一种模板,基本上是克隆元素,然后用您想要的值替换部分。

首先,使用remove从DOM中移除Element,尽管该元素已从DOM中删除,但它不会阻止您克隆它

现在,无论何时需要另一个,都可以调用clone(true),true=deepClone,然后使用querySelector将DOM的部分替换为所需的位。最后将这个克隆的元素添加到DOM中。

下面是一个简单的例子。。

const ol = document.querySelector('ol');
const template = document.querySelector('li');
template.remove();
function append(o) {
const {author, message, time} = o;
const clone = template.cloneNode(true);
clone.querySelector('.author').innerText=author;
clone.querySelector('.message').innerText=message;
clone.querySelector('.time').lastChild.nodeValue=time;
ol.appendChild(clone); 
}
append({
author: "me",
message: "Message...",
time: "15:21"
});
append({
author: "Another me",
message: "Something else..",
time: "12:42"
});
append({
author: "Whatever",
message: "lalala..",
time: "17:20"
});
.author {
font-weight: bold;
margin-right: 1rem;
}
.time {
color: green;
}
li {
margin: 0.5rem;
border: 1px solid silver;
}
.line {
border-bottom: 1px dotted red;
}
<ol>
<li>
<span class="author">Me</span>
<span class="message">Message...</span>
<span class="time">
<div class="line"></div>
15:21
</span>
</li>
</ol>

最新更新