Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace element contents with document fragment javascript

I'm trying to replace all contents of an element with a document fragment:

var frag = document.createDocumentFragment()

The document fragment is being created just fine. No problems there. I add elements to it just fine, no problems there either. I can append it using element.appendChild(frag). That works just fine too.

I'm trying to create a "replace" method similar to jQuery's HTML. I'm not worried about old-browser compatibility. Is there a magical function to replace all content of an element?

I have tried element.innerHTML = frag.cloneNode(true), (as per every 'replace element content' wiki I could find), that doesn't work. It gives me <div>[object DocumentFragment]</div>.

No libraries, please, not even a jQuery solution.

For clarity, I'm looking for a "magic" solution, I know how to remove all the existing elements one at a time and then append my fragment.

like image 282
Randy Hall Avatar asked Nov 09 '12 15:11

Randy Hall


1 Answers

Have you tried replaceChild

something like this

element.parentNode.replaceChild(frag, element)

source: https://developer.mozilla.org/en-US/docs/DOM/Node.replaceChild

original jsFiddle: http://jsfiddle.net/tomprogramming/RxFZA/

EDIT: ahh, I didn't see replace contents. Well, just remove them first!

element.innerHTML = "";
element.appendChild(frag);

jsfiddle: http://jsfiddle.net/tomprogramming/RxFZA/1/

note that in the jsfiddle, I only use jquery to hook up the button, the entirety of the click handler is raw javascript.

Edit2: also suggested by pimvdb, but just append the new stuff to a detached element and replace.

var newElement = element.cloneNode();
newElement.innerHTML = "";
newElement.appendChild(frag);
element.parentNode.replaceChild(newElement, element);

http://jsfiddle.net/tomprogramming/RxFZA/3/

like image 83
Thomas Jones Avatar answered Nov 08 '22 20:11

Thomas Jones