If I need to create a couple of nested DOM elements, I know one way to do it, is to write them as long string and then place them in the document using a suitable jQuery function. Something like:
elem.html(
'<div class="wrapper">
<div class="inner">
<span>Some text<span>
</div>
<div class="inner">
<span>Other text<span>
</div>
</div>');
This way is obviously not the cleanest. The sting doesn't take too long to get messy and editing becomes a problem. I much more prefer this notation:
$('<div></div>', {
class : 'inner'
})
.appendTo( elem );
The problem is I don't know how to implement it efficiently when creating nested elements on the fly like above. So if there is way to do the 1st example with the 2nd notation, I'll be glad to learn about it.
Basically, the question is, whats the best way to create nested HTML elements on the fly, without having to deal wit messy long strings?
Note : I am aware of templating engines. However this is a question concerning the creation of just a couple of HTML elements on the fly. Like while building the DOM dependencies for a plugin or similar cases.
The problem with this approach is that you'll need a multi-line string - something Javascript doesn't support - so in reality you'll end up with:
Using the method you suggested above, this is about as clean as I could manage to get it:
The other advantage to doing this is that you can (if desired) get direct references to each newly created element without having to re-query the DOM.
I like to write polyglots, so to make my code re-usuable I usually do something like this, (as jQuery's
.html()
doesn't support XML):This isn't very different to method #2 but it gives you more portable code and doesn't rely internally on
innerHTML
.There is a third way besides long ugly strings or huge methods chained together. You can use plain old variables to hold the individual elements:
Then, tie it all together with
append
:Result:
In my opinion this is by far the cleanest and most readable approach, and it also has the advantage of separating the data from the code.
EDIT: One caveat, however, is that there is no easy way to mix
textContent
with nested elements (e.g.,<p>Hello, <b>world!</b></p>
.) In that case you would probably need to use one of the other techniques such as a string literal.I found this solution while I was researching something else. It's part of an "Introduction to jQuery" by the creator of jQuery and uses the end() function.
Applying to your question it would be ...
I like the following approach myself:
Alternatively, create your wrapper first, and keep adding to it:
I like this approach
Long string is obviously the cleanest way possible. You see the code properly nested without all those unnecessary extra noise like brackets, dollar signs and what not. Sure, it'd be advantages to be able to write it as a multiline string, but that's not possible for now. To me the point is to get rid of all the unneeded symbols. I don't know how comes the string gets messy and editing becomes a problem. If you've assigned a lot of classes you can put them on separate line:
or this way:
Another option is probably to use
haml
on the client side, if that's possible. That way you'll have even less unneeded noise.