ich habe gerade einen Fall, da muss ich längere HTML-Schnipsel durch eine JavaScript-Funktion ausgeben lassen, d.h. das HTML steht in einem JavaScript-String. Das ist ein bissel lästig, denn ich darf da ja keine Zeilenumbrüche in den Quellcode bauen.
In größeren JavaScript-Anwendungen hat man das Problem ständig. Wir lösen das meist, indem wir die Templates erst einmal nicht ins JavaScript integrieren, sondern sie in separaten Dateien ablegen. Die werden dann entweder clientseitig als Strings eingelesen oder serverseitig automatisiert in JavaScript-Dateien umgewandelt.
Das Füllen erfolgt dann mit einer Template-Engine wie Mustache oder Eco. Da wir meist im Rails-Umfeld HTML-Templates in Haml und die JavaScripte in CoffeeScript schreiben, haben wir einen Haml-Coffee-Parser entwickelt. Die Templates werden damit zu JavaScripten (Funktionen) kompiliert.
Für kleinere Sachen würde ich die von Matti vorgeschlagene Lösung favorisieren. Übrigens lässt sich auch HTML-Code in script-Elementen unterbringen, ohne dass es sich um JavaScript handelt. Beispielsweise kann man ein Template so in den HTML-Code schreiben:
<script type="text/x-mustache" id="foo-view">
<h2>{{title}}</h2>
<p>{{text}}</p>
<p><img src="{{imageURL}}"></p>
</script>
Das ist eine Art CDATA-Abschnitt, nur ohne XML. Der MIME-Typ im type-Attribut muss nur irgendeiner sein, den der Browser nicht als JavaScript erkennt. script-Elemente kann man so natürlich nicht verschachteln.
Mit JavaScript holt man sich dann den Inhalt von foo-view, lässt z.B. Mustache darüber laufen und fügt die entstehenden DOM-Elemente irgendwo ein.
Der Vorteil zum Einbinden als HTML und Verstecken ist hier, dass das HTML nicht geparst wird, sondern als String vorliegt. Beim Parsen würde Quatsch passieren, z.B. würde er versuchen, die URL {{imageURL}} zu laden.
Wenn man mehr Logik braucht, als Mustache einem bietet, so gibt es wie gesagt komplexere Template-Lösungen, bei denen sich JavaScript oder CoffeeScript im Template verwenden lässt.
Mathias