Проблема в том, что DocumentFragment
переместит содержимое фрагмента в новое место в DOM, но сам фрагмент останется фрагментом, не связанным напрямую ни с чем:
https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild
Если данный дочерний элемент является DocumentFragment, все содержимое DocumentFragment перемещается в дочерний список указанного родительского узла.
В конце концов, в противном случае, если строка HTML -
<div>Test element appended</div><div>Test element 2 appended</div>
, на что может ссылаться добавленная documentFragment
?Это не может быть просто один или другой <div>
, а также не может быть родительским элементом (который уже был в DOM и не был создан с фрагментом).
Итак, однажды documentFragment
добавлен, он не может быть удален за один раз.
Если фрагмент гарантированно содержит только один элемент, как в вашем примере, выберите этот элемент и добавьте it (а затем вы можете правильно ссылаться на его parentNode
).
// though using a documentFragment in the first place is a bit odd
// if you're not going to append it
var createHTML = function(htmlStr) {
var frag = document.createDocumentFragment(),
temp = document.createElement('div');
temp.innerHTML = htmlStr;
while (temp.firstChild) {
frag.appendChild(temp.firstChild);
}
return frag;
}
var appendItems = function() {
const elementHTML = '<div>Test element appended</div>';
const fragment = createHTML(elementHTML);
const fragmentElm = fragment.children[0];
document.getElementById('append-container').appendChild(fragmentElm);
setTimeout(function() {
fragmentElm.parentNode.removeChild(fragmentElm);
}, 2000, elementHTML);
}
document.getElementById('test-append').addEventListener('click', appendItems);
<div id="append-container">
</div>
<button id="test-append">
Test
</button>
Другой вариант - перебрать все добавленные узлы и .remove()
их:
var createHTML = function(htmlStr) {
var frag = document.createDocumentFragment(),
temp = document.createElement('div');
temp.innerHTML = htmlStr;
while (temp.firstChild) {
frag.appendChild(temp.firstChild);
}
return frag;
}
var appendItems = function() {
const elementHTML = '<div>Test element appended</div><div>Test element 2 appended</div>';
const fragment = createHTML(elementHTML);
const fragmentElms = [...fragment.children];
const container = document.getElementById('append-container');
fragmentElms.forEach((elm) => {
container.appendChild(elm);
});
setTimeout(function() {
fragmentElms.forEach((elm) => {
elm.remove();
});
}, 2000, elementHTML);
}
document.getElementById('test-append').addEventListener('click', appendItems);
<div id="append-container">
</div>
<button id="test-append">
Test
</button>