Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery document.createElement equivalent?

I'm refactoring some old JavaScript code and there's a lot of DOM manipulation going on.

var d = document; var odv = d.createElement("div"); odv.style.display = "none"; this.OuterDiv = odv;  var t = d.createElement("table"); t.cellSpacing = 0; t.className = "text"; odv.appendChild(t); 

I would like to know if there is a better way to do this using jQuery. I've been experimenting with:

var odv = $.create("div"); $.append(odv); // And many more 

But I'm not sure if this is any better.

like image 509
Rob Stevenson-Leggett Avatar asked Nov 06 '08 12:11

Rob Stevenson-Leggett


People also ask

What does document createElement (' a ') return?

The document. createElement() accepts an HTML tag name and returns a new Node with the Element type.

What is the difference between innerHTML and createElement?

#1) createElement is more performant However, using the innerHTML causes the web browsers to reparse and recreate all DOM nodes inside the div element. Therefore, it is less efficient than creating a new element and appending to the div.

What is createElement () method?

The createElement() method creates an element node.


2 Answers

Simply supplying the HTML of elements you want to add to a jQuery constructor $() will return a jQuery object from newly built HTML, suitable for being appended into the DOM using jQuery's append() method.

For example:

var t = $("<table cellspacing='0' class='text'></table>"); $.append(t); 

You could then populate this table programmatically, if you wished.

This gives you the ability to specify any arbitrary HTML you like, including class names or other attributes, which you might find more concise than using createElement and then setting attributes like cellSpacing and className via JS.

like image 26
Adam Bellaire Avatar answered Sep 20 '22 13:09

Adam Bellaire


Here's your example in the "one" line.

this.$OuterDiv = $('<div></div>')     .hide()     .append($('<table></table>')         .attr({ cellSpacing : 0 })         .addClass("text")     ) ; 

Update: I thought I'd update this post since it still gets quite a bit of traffic. In the comments below there's some discussion about $("<div>") vs $("<div></div>") vs $(document.createElement('div')) as a way of creating new elements, and which is "best".

I put together a small benchmark, and here are roughly the results of repeating the above options 100,000 times:

jQuery 1.4, 1.5, 1.6

               Chrome 11  Firefox 4   IE9 <div>            440ms      640ms    460ms <div></div>      420ms      650ms    480ms createElement    100ms      180ms    300ms 

jQuery 1.3

                Chrome 11 <div>             770ms <div></div>      3800ms createElement     100ms 

jQuery 1.2

                Chrome 11 <div>            3500ms <div></div>      3500ms createElement     100ms 

I think it's no big surprise, but document.createElement is the fastest method. Of course, before you go off and start refactoring your entire codebase, remember that the differences we're talking about here (in all but the archaic versions of jQuery) equate to about an extra 3 milliseconds per thousand elements.


Update 2

Updated for jQuery 1.7.2 and put the benchmark on JSBen.ch which is probably a bit more scientific than my primitive benchmarks, plus it can be crowdsourced now!

http://jsben.ch/#/ARUtz

like image 195
nickf Avatar answered Sep 17 '22 13:09

nickf