How do I update the reference to an HTML element after I used appendChild with native javascriptHow to validate an email address in JavaScript?How do JavaScript closures work?How do I check if an element is hidden in jQuery?How do I remove a property from a JavaScript object?How do you get a timestamp in JavaScript?How do I check if an array includes an object in JavaScript?How do I include a JavaScript file in another JavaScript file?How to replace all occurrences of a string in JavaScriptHow to check whether a string contains a substring in JavaScript?How do I remove a particular element from an array in JavaScript?
How to bake one texture for one mesh with multiple textures blender 2.8
The IT department bottlenecks progress. How should I handle this?
What prevents the use of a multi-segment ILS for non-straight approaches?
When were female captains banned from Starfleet?
How should I respond when I lied about my education and the company finds out through background check?
Redundant comparison & "if" before assignment
Count the occurrence of each unique word in the file
Is it possible to put a rectangle as background in the author section?
Electoral considerations aside, what are potential benefits, for the US, of policy changes proposed by the tweet recognizing Golan annexation?
Should I outline or discovery write my stories?
How do I color the graph in datavisualization?
Melting point of aspirin, contradicting sources
Problem with TransformedDistribution
Is it improper etiquette to ask your opponent what his/her rating is before the game?
What does "Scientists rise up against statistical significance" mean? (Comment in Nature)
Pre-mixing cryogenic fuels and using only one fuel tank
Biological Blimps: Propulsion
Is there any references on the tensor product of presentable (1-)categories?
How much character growth crosses the line into breaking the character
Is it better practice to read straight from sheet music rather than memorize it?
Why should universal income be universal?
Why can Carol Danvers change her suit colours in the first place?
Why did the EU agree to delay the Brexit deadline?
Why did the Mercure fail?
How do I update the reference to an HTML element after I used appendChild with native javascript
How to validate an email address in JavaScript?How do JavaScript closures work?How do I check if an element is hidden in jQuery?How do I remove a property from a JavaScript object?How do you get a timestamp in JavaScript?How do I check if an array includes an object in JavaScript?How do I include a JavaScript file in another JavaScript file?How to replace all occurrences of a string in JavaScriptHow to check whether a string contains a substring in JavaScript?How do I remove a particular element from an array in JavaScript?
I'm using native javascript to append an element to my DOM, which disappears after X seconds.
To append the element I create a document fragment with a function createHTML
I then append this element to my container element.
var elementHTML = '<div>Test element appended</div>';
elementHTML = createHTML(elementHTML);
document.getElementById('append-container').appendChild(elementHTML);
I then set a timeout that removes the element from the DOM after x seconds
setTimeout(function()
elementHTML.parentNode.removeChild(elementHTML);
, 2000, elementHTML);
Now this won't work because when you use appendChild, the elements get moved and the reference to the element is lost. I'm looking for a way to update the reference for elementHTML
to the element I just appended to the DOM.
Basically I'm looking for the jQuery reference funcionality without using jQuery.
I could use a randomly generated ID to target the element or add a class and loop trough all the elements with that class and target the last one, but these methods feel ugly.
I'm wondering if there is some sort of callback when you append something to the DOM to target what you just appended or if my logic in going about this is just plain wrong.
FIDDLE
javascript appendchild
add a comment |
I'm using native javascript to append an element to my DOM, which disappears after X seconds.
To append the element I create a document fragment with a function createHTML
I then append this element to my container element.
var elementHTML = '<div>Test element appended</div>';
elementHTML = createHTML(elementHTML);
document.getElementById('append-container').appendChild(elementHTML);
I then set a timeout that removes the element from the DOM after x seconds
setTimeout(function()
elementHTML.parentNode.removeChild(elementHTML);
, 2000, elementHTML);
Now this won't work because when you use appendChild, the elements get moved and the reference to the element is lost. I'm looking for a way to update the reference for elementHTML
to the element I just appended to the DOM.
Basically I'm looking for the jQuery reference funcionality without using jQuery.
I could use a randomly generated ID to target the element or add a class and loop trough all the elements with that class and target the last one, but these methods feel ugly.
I'm wondering if there is some sort of callback when you append something to the DOM to target what you just appended or if my logic in going about this is just plain wrong.
FIDDLE
javascript appendchild
add a comment |
I'm using native javascript to append an element to my DOM, which disappears after X seconds.
To append the element I create a document fragment with a function createHTML
I then append this element to my container element.
var elementHTML = '<div>Test element appended</div>';
elementHTML = createHTML(elementHTML);
document.getElementById('append-container').appendChild(elementHTML);
I then set a timeout that removes the element from the DOM after x seconds
setTimeout(function()
elementHTML.parentNode.removeChild(elementHTML);
, 2000, elementHTML);
Now this won't work because when you use appendChild, the elements get moved and the reference to the element is lost. I'm looking for a way to update the reference for elementHTML
to the element I just appended to the DOM.
Basically I'm looking for the jQuery reference funcionality without using jQuery.
I could use a randomly generated ID to target the element or add a class and loop trough all the elements with that class and target the last one, but these methods feel ugly.
I'm wondering if there is some sort of callback when you append something to the DOM to target what you just appended or if my logic in going about this is just plain wrong.
FIDDLE
javascript appendchild
I'm using native javascript to append an element to my DOM, which disappears after X seconds.
To append the element I create a document fragment with a function createHTML
I then append this element to my container element.
var elementHTML = '<div>Test element appended</div>';
elementHTML = createHTML(elementHTML);
document.getElementById('append-container').appendChild(elementHTML);
I then set a timeout that removes the element from the DOM after x seconds
setTimeout(function()
elementHTML.parentNode.removeChild(elementHTML);
, 2000, elementHTML);
Now this won't work because when you use appendChild, the elements get moved and the reference to the element is lost. I'm looking for a way to update the reference for elementHTML
to the element I just appended to the DOM.
Basically I'm looking for the jQuery reference funcionality without using jQuery.
I could use a randomly generated ID to target the element or add a class and loop trough all the elements with that class and target the last one, but these methods feel ugly.
I'm wondering if there is some sort of callback when you append something to the DOM to target what you just appended or if my logic in going about this is just plain wrong.
FIDDLE
javascript appendchild
javascript appendchild
asked Mar 7 at 7:40
timotimo
1,5371629
1,5371629
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
The issue is that a DocumentFragment
will move the contents of the fragment into the new place in the DOM, but the fragment itself will remain a fragment, not directly attached to anything:
https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild
If the given child is a DocumentFragment, the entire contents of the DocumentFragment are moved into the child list of the specified parent node.
After all, otherwise, if the HTML string is
<div>Test element appended</div><div>Test element 2 appended</div>
what could the appended documentFragment
refer to? It's couldn't be just one or the other <div>
, nor could it be the parent element (which was already in the DOM, and was not created with the fragment).
So, once a documentFragment
is appended, it cannot be removed all in one go.
If the fragment is guaranteed to contain only one element, like in your example, then select that one element and append it instead (and then you can properly reference its 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>
Another option is to iterate through all appended nodes and .remove()
them:
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>
I wasn't even aware I could add multiple siblings via this method. In my usecase, there will always be a single parent element, so I'm going with your first option.
– timo
Mar 7 at 8:15
If there's guaranteed to be a single parent, then you can ditch the fragment entirely and simply returntemp
'sfirstChild
– CertainPerformance
Mar 7 at 8:16
I was using the fragment because I want to add an eventlistener to part of the added element. I thought this was not possible without fragment. I now found the issue lay in the fact that I was targeting a part of the dynamic element with document.getElementById while it was not yet added to the DOM. This was why is WAS working with fragment. This is a different issue which I need to inspect further before asking follow up questions. Your provided sollution is still valid for the question as is, hence I will keep it accepted.
– timo
Mar 7 at 8:49
Turns out I just needed to replace getElementById with querySelector
– timo
Mar 7 at 9:02
add a comment |
Appending the nodes in the while
loop is unnecessary: innerHTML
already does that for you.
var createHTML = function(htmlStr)
var temp = document.createElement('div');
temp.innerHTML = htmlStr;
return temp;
In this way – without the DOM fragment – removing the element after the timeout works as expected.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55038461%2fhow-do-i-update-the-reference-to-an-html-element-after-i-used-appendchild-with-n%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
The issue is that a DocumentFragment
will move the contents of the fragment into the new place in the DOM, but the fragment itself will remain a fragment, not directly attached to anything:
https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild
If the given child is a DocumentFragment, the entire contents of the DocumentFragment are moved into the child list of the specified parent node.
After all, otherwise, if the HTML string is
<div>Test element appended</div><div>Test element 2 appended</div>
what could the appended documentFragment
refer to? It's couldn't be just one or the other <div>
, nor could it be the parent element (which was already in the DOM, and was not created with the fragment).
So, once a documentFragment
is appended, it cannot be removed all in one go.
If the fragment is guaranteed to contain only one element, like in your example, then select that one element and append it instead (and then you can properly reference its 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>
Another option is to iterate through all appended nodes and .remove()
them:
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>
I wasn't even aware I could add multiple siblings via this method. In my usecase, there will always be a single parent element, so I'm going with your first option.
– timo
Mar 7 at 8:15
If there's guaranteed to be a single parent, then you can ditch the fragment entirely and simply returntemp
'sfirstChild
– CertainPerformance
Mar 7 at 8:16
I was using the fragment because I want to add an eventlistener to part of the added element. I thought this was not possible without fragment. I now found the issue lay in the fact that I was targeting a part of the dynamic element with document.getElementById while it was not yet added to the DOM. This was why is WAS working with fragment. This is a different issue which I need to inspect further before asking follow up questions. Your provided sollution is still valid for the question as is, hence I will keep it accepted.
– timo
Mar 7 at 8:49
Turns out I just needed to replace getElementById with querySelector
– timo
Mar 7 at 9:02
add a comment |
The issue is that a DocumentFragment
will move the contents of the fragment into the new place in the DOM, but the fragment itself will remain a fragment, not directly attached to anything:
https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild
If the given child is a DocumentFragment, the entire contents of the DocumentFragment are moved into the child list of the specified parent node.
After all, otherwise, if the HTML string is
<div>Test element appended</div><div>Test element 2 appended</div>
what could the appended documentFragment
refer to? It's couldn't be just one or the other <div>
, nor could it be the parent element (which was already in the DOM, and was not created with the fragment).
So, once a documentFragment
is appended, it cannot be removed all in one go.
If the fragment is guaranteed to contain only one element, like in your example, then select that one element and append it instead (and then you can properly reference its 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>
Another option is to iterate through all appended nodes and .remove()
them:
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>
I wasn't even aware I could add multiple siblings via this method. In my usecase, there will always be a single parent element, so I'm going with your first option.
– timo
Mar 7 at 8:15
If there's guaranteed to be a single parent, then you can ditch the fragment entirely and simply returntemp
'sfirstChild
– CertainPerformance
Mar 7 at 8:16
I was using the fragment because I want to add an eventlistener to part of the added element. I thought this was not possible without fragment. I now found the issue lay in the fact that I was targeting a part of the dynamic element with document.getElementById while it was not yet added to the DOM. This was why is WAS working with fragment. This is a different issue which I need to inspect further before asking follow up questions. Your provided sollution is still valid for the question as is, hence I will keep it accepted.
– timo
Mar 7 at 8:49
Turns out I just needed to replace getElementById with querySelector
– timo
Mar 7 at 9:02
add a comment |
The issue is that a DocumentFragment
will move the contents of the fragment into the new place in the DOM, but the fragment itself will remain a fragment, not directly attached to anything:
https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild
If the given child is a DocumentFragment, the entire contents of the DocumentFragment are moved into the child list of the specified parent node.
After all, otherwise, if the HTML string is
<div>Test element appended</div><div>Test element 2 appended</div>
what could the appended documentFragment
refer to? It's couldn't be just one or the other <div>
, nor could it be the parent element (which was already in the DOM, and was not created with the fragment).
So, once a documentFragment
is appended, it cannot be removed all in one go.
If the fragment is guaranteed to contain only one element, like in your example, then select that one element and append it instead (and then you can properly reference its 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>
Another option is to iterate through all appended nodes and .remove()
them:
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>
The issue is that a DocumentFragment
will move the contents of the fragment into the new place in the DOM, but the fragment itself will remain a fragment, not directly attached to anything:
https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild
If the given child is a DocumentFragment, the entire contents of the DocumentFragment are moved into the child list of the specified parent node.
After all, otherwise, if the HTML string is
<div>Test element appended</div><div>Test element 2 appended</div>
what could the appended documentFragment
refer to? It's couldn't be just one or the other <div>
, nor could it be the parent element (which was already in the DOM, and was not created with the fragment).
So, once a documentFragment
is appended, it cannot be removed all in one go.
If the fragment is guaranteed to contain only one element, like in your example, then select that one element and append it instead (and then you can properly reference its 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>
Another option is to iterate through all appended nodes and .remove()
them:
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>
// 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>
// 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>
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>
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>
edited Mar 7 at 8:05
answered Mar 7 at 7:50
CertainPerformanceCertainPerformance
95.1k165685
95.1k165685
I wasn't even aware I could add multiple siblings via this method. In my usecase, there will always be a single parent element, so I'm going with your first option.
– timo
Mar 7 at 8:15
If there's guaranteed to be a single parent, then you can ditch the fragment entirely and simply returntemp
'sfirstChild
– CertainPerformance
Mar 7 at 8:16
I was using the fragment because I want to add an eventlistener to part of the added element. I thought this was not possible without fragment. I now found the issue lay in the fact that I was targeting a part of the dynamic element with document.getElementById while it was not yet added to the DOM. This was why is WAS working with fragment. This is a different issue which I need to inspect further before asking follow up questions. Your provided sollution is still valid for the question as is, hence I will keep it accepted.
– timo
Mar 7 at 8:49
Turns out I just needed to replace getElementById with querySelector
– timo
Mar 7 at 9:02
add a comment |
I wasn't even aware I could add multiple siblings via this method. In my usecase, there will always be a single parent element, so I'm going with your first option.
– timo
Mar 7 at 8:15
If there's guaranteed to be a single parent, then you can ditch the fragment entirely and simply returntemp
'sfirstChild
– CertainPerformance
Mar 7 at 8:16
I was using the fragment because I want to add an eventlistener to part of the added element. I thought this was not possible without fragment. I now found the issue lay in the fact that I was targeting a part of the dynamic element with document.getElementById while it was not yet added to the DOM. This was why is WAS working with fragment. This is a different issue which I need to inspect further before asking follow up questions. Your provided sollution is still valid for the question as is, hence I will keep it accepted.
– timo
Mar 7 at 8:49
Turns out I just needed to replace getElementById with querySelector
– timo
Mar 7 at 9:02
I wasn't even aware I could add multiple siblings via this method. In my usecase, there will always be a single parent element, so I'm going with your first option.
– timo
Mar 7 at 8:15
I wasn't even aware I could add multiple siblings via this method. In my usecase, there will always be a single parent element, so I'm going with your first option.
– timo
Mar 7 at 8:15
If there's guaranteed to be a single parent, then you can ditch the fragment entirely and simply return
temp
's firstChild
– CertainPerformance
Mar 7 at 8:16
If there's guaranteed to be a single parent, then you can ditch the fragment entirely and simply return
temp
's firstChild
– CertainPerformance
Mar 7 at 8:16
I was using the fragment because I want to add an eventlistener to part of the added element. I thought this was not possible without fragment. I now found the issue lay in the fact that I was targeting a part of the dynamic element with document.getElementById while it was not yet added to the DOM. This was why is WAS working with fragment. This is a different issue which I need to inspect further before asking follow up questions. Your provided sollution is still valid for the question as is, hence I will keep it accepted.
– timo
Mar 7 at 8:49
I was using the fragment because I want to add an eventlistener to part of the added element. I thought this was not possible without fragment. I now found the issue lay in the fact that I was targeting a part of the dynamic element with document.getElementById while it was not yet added to the DOM. This was why is WAS working with fragment. This is a different issue which I need to inspect further before asking follow up questions. Your provided sollution is still valid for the question as is, hence I will keep it accepted.
– timo
Mar 7 at 8:49
Turns out I just needed to replace getElementById with querySelector
– timo
Mar 7 at 9:02
Turns out I just needed to replace getElementById with querySelector
– timo
Mar 7 at 9:02
add a comment |
Appending the nodes in the while
loop is unnecessary: innerHTML
already does that for you.
var createHTML = function(htmlStr)
var temp = document.createElement('div');
temp.innerHTML = htmlStr;
return temp;
In this way – without the DOM fragment – removing the element after the timeout works as expected.
add a comment |
Appending the nodes in the while
loop is unnecessary: innerHTML
already does that for you.
var createHTML = function(htmlStr)
var temp = document.createElement('div');
temp.innerHTML = htmlStr;
return temp;
In this way – without the DOM fragment – removing the element after the timeout works as expected.
add a comment |
Appending the nodes in the while
loop is unnecessary: innerHTML
already does that for you.
var createHTML = function(htmlStr)
var temp = document.createElement('div');
temp.innerHTML = htmlStr;
return temp;
In this way – without the DOM fragment – removing the element after the timeout works as expected.
Appending the nodes in the while
loop is unnecessary: innerHTML
already does that for you.
var createHTML = function(htmlStr)
var temp = document.createElement('div');
temp.innerHTML = htmlStr;
return temp;
In this way – without the DOM fragment – removing the element after the timeout works as expected.
answered Mar 7 at 8:10
JoeJoe
6151020
6151020
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55038461%2fhow-do-i-update-the-reference-to-an-html-element-after-i-used-appendchild-with-n%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown