【发布时间】:2018-08-21 07:52:09
【问题描述】:
所以我这两天一直在寻找答案。有人会如何创建一个元素,然后用 innerHTML 将其写入 HTML?
function dataPull() {
// Connects to my server from which it pulls JSON data containing start,end,summary,organizer of the event.
fetch("http://localhost:8000/events").then((resp) => resp.json()).then(render)
};
function eventFilter(event) {
eventTime = new Date(event);
eventHours = eventTime.getHours();
eventMinutes = eventTime.getMinutes();
if (eventMinutes < 10) {
eventMinutes = "0" + eventMinutes
}
return event = eventHours + ":" + eventMinutes;
};
function eventMap(eventBooked) {
return `
<div class="event">
<div class="eventTime">${eventFilter(eventBooked.start)}
<p class="timep">${eventFilter(eventBooked.end)}</p>
</div>
<div class="eventInfo">
<h1 class="eventSummary"> ${eventBooked.summary}</h1>
<p class="eventOrganizer">${eventBooked.organizer}</p>
</div>
</div>`;
};
function render(data) {
data.events.sort(function(a, b) {
return new Date(a.start).getTime() - new Date(b.start).getTime();
});
// Delete outdated events.
let eventsNotOutdated = data.events.filter((item) => {
let endTime = new Date(item.end);
if (Date.now() < endTime) {
return item;
}
});
// Create a new variable for event currently in progress.
let eventInProgress = eventsNotOutdated.filter((item) => {
let startTime = new Date(item.start);
if (Date.now() > startTime) {
return item;
}
});
// Same as eventsNotOutdated but without the event in progress.
let filteredEventsNotOutdated = eventsNotOutdated.filter((item) => {
let startTime = new Date(item.start);
if (Date.now() < startTime) {
return item;
}
});
if (eventInProgress.length > 0 && filteredEventsNotOutdated.length >= 1) {
return document.getElementById("eventList").innerHTML =
`<div>
<h1 class="announcerBig">In progress</h1>
<div class="eventBig">
<div class="eventTimeBig">${eventFilter(eventInProgress[0].start)}
<p class=timep>${eventFilter(eventInProgress[0].end)}</p>
</div>
<div class="eventInfoBig">
<h1 class="eventSummaryBig">${eventInProgress[0].summary}</h1>
<p class="eventOrganizerBig">${eventInProgress[0].organizer}</p>
</div>
</div>
</div>
<div class=eventsInProgress>
<h1 class="announcer">Later</h1>${filteredEventsNotOutdated.map(eventMap).join("")}
</div>`;
} else if (eventInProgress.length > 0 && filteredEventsNotOutdated.length < 1) {
return doc.getElementById("eventList").innerHTML =
`<div>
<h1 class="announcerBig">In progress</h1>
<div class="eventBig">
<div class="eventTimeBig">${eventFilter(eventInProgress[0].start)}
<p class=timep>${eventFilter(eventInProgress[0].end)}</p>
</div>
<div class="eventInfoBig">
<h1 class="eventSummaryBig">${eventInProgress[0].summary}</h1>
<p class="eventOrganizerBig">${eventInProgress[0].organizer}</p>
</div>
</div>`
} else if (eventInProgress.length === 0 && filteredEventsNotOutdated.length > 0) {
return document.getElementById("eventList").innerHTML =
`<h1 class="announcerBig">Coming up next</h1>${filteredEventsNotOutdated.map(eventMap).join("")}`;
} else {
document.getElementById("eventList").innerHTML =
`<p class="noevent">No meetings scheduled.</p><p class="schedule">Schedule meetings on google calendars.`;
};
};
setTimeout(dataPull);
setInterval(dataPull, 10000);
<html>
<head>
</head>
<body id='body'>
<div id='eventList' class="eventList"></div>
<script src="example.js"></script>
</body>
</html>
这是我正在使用的代码的快速演示。如您所见,我没有使用任何 document.createElement 方法,但是如果我使用 createElement 代替反引号会怎样。我试过了,但问题是,每 10 秒(由于间隔)它调用函数并不断写入相同的元素。注意:需要间隔,因为我提取的数据会不断更新,因此我需要在显示器上不断更新。
现在我的问题是: 是否可以使用 innerHTML 方法在 HTML 中编写带有附加子项的创建元素?
【问题讨论】:
-
是的,您可以使用 innerHTML 在字符串中附加子项
-
我不明白这个问题?您已经使用
.innerHTML添加新元素 - 这似乎有效,因为您提到当您不使用模板文字时它无法工作 O.o -
如果我理解你没有去
node.appendChild,因为它会一次又一次地创建相同的元素,解决方案是使用node.removeChild,如果你保留孩子,你可以这样做child.parentNode.removeChild(child) -
@Andreas 模板文字工作正常,但有没有办法只使用 createElement.然后在创建元素后每次写入元素innerHTML,这样它总是会覆盖以前的数据。
-
@jonatjano 是的,但我想这样做,该函数会在 HTML 中写入我将使用 createElement 创建的所有元素,然后用新元素覆盖它们。不添加它们。
node.removeChild可以工作,但没有要删除的孩子,因为它们都不会被创建。
标签: javascript html dom