Erläuterung von <script type = “text / template”>… </ script>

456

Ich bin gerade auf etwas gestoßen, das ich noch nie gesehen habe. In der Quelle der Backbone.js-Beispiel-TODO-Anwendung ( Backbone TODO-Beispiel ) hatten sie ihre Vorlagen in einem <script type = "text/template"></script>, der Code enthielt, der wie etwas aus PHP aussieht, aber JavaScript-Tags enthält.

Kann mir das jemand erklären? Ist das legitim?

Matt
quelle
Tolle Frage und Antwort. Ich bin gerade auf diesen Trick im neuen YUI App Framework-Code gestoßen
mjhm
4
Was habe type="text/tcl"ich im W3C-Dokument gesehen ? Wie benutzt man es? (Soll ich noch eine Frage stellen?)
L01man
3
@ L01man ja, du solltest eine andere Frage stellen.
Nate Glenn
mjhms YUI-Link jetzt unter: yuilibrary.com/yui/docs/app/app-todo.html
gpvos

Antworten:

413

Diese Skript-Tags sind eine übliche Methode zum Implementieren von Vorlagenfunktionen (wie in PHP), jedoch auf der Clientseite.

Wenn Sie den Typ auf "Text / Vorlage" setzen, ist dies kein Skript, das der Browser verstehen kann, und der Browser ignoriert es einfach. Auf diese Weise können Sie alles dort einfügen, was später extrahiert und von einer Vorlagenbibliothek zum Generieren von HTML-Snippets verwendet werden kann.

Backbone zwingt Sie nicht dazu, eine bestimmte Vorlagenbibliothek zu verwenden - es gibt einige: Schnurrbart , Haml , Eco , Google Closure-Vorlage usw. (die in dem Beispiel, mit dem Sie verlinkt haben, ist underscore.js ). Diese verwenden ihre eigene Syntax, damit Sie in diese Skript-Tags schreiben können.

David Tang
quelle
22
@ Matt, genau das. Gleichzeitig ist es einfach, den vollständigen Text mithilfe von .innerHTMLTemplate-Engines wieder abzurufen .
David Tang
1
Ist das nicht einfach eine fantastische Nachricht? Ich habe nach einer solchen Lösung gesucht. Vielen Dank für Ihre Antwort und Ihr Follow-up!
Matt
7
Hallo, anderer Matt hier. Würde <script type = "text / template"> einen HTML-Überprüfungstest bestehen?
Matt
17
Ich freue mich auf <template />Tag. html5rocks.com/de/tutorials/webcomponents/template & caniuse.com/#search=template
Volker E.
5
Hallo aus der Zukunft. <template>ist hier, aber Websites verwenden immer noch diese Technik, wie z. B. reddit.com. : F
Victor Zamanian
114

Es ist echt und sehr praktisch!

Versuche dies:

<script id="hello" type="text/template">
  Hello world
</script>
<script>
  alert($('#hello').html());
</script>

Mehrere Javascript-Vorlagenbibliotheken verwenden diese Technik. Handlebars.js ist ein gutes Beispiel.

Rimian
quelle
5
Wie würden Sie diese Warnung in rohem Javascript mit jquery ausführen?
Zittern
3
@tremor Meinst du in rohem Javascript ohne jquery? So etwas wie: var el = document.getElementById ('Hallo'); var html = el.textContent; alert (html); (Sie müssen sich
eingehender mit der
@SgtPooki ya ich meinte ohne, danke für die Antwort. Was ich wirklich gerne tun würde, ist, dieses Skript in eine externe Datei zu übertragen und es abzurufen, aber ich habe festgestellt, dass dies nicht wirklich möglich ist. Deshalb tauche ich jetzt in AJAX und socket.io ein.
Zittern
@tremor, ich verstehe möglicherweise nicht genau, was Sie versuchen, aber es ist definitiv möglich, externe Dateien dynamisch abzurufen, um sie entweder als Vorlage auszuführen oder zu analysieren. Check out requirejs.
SgtPooki
@tremor Wenn Sie externe Dateien dynamisch abrufen möchten, verwende ich lieber XHR als Skript-Tags. XHR funktioniert auch mit einfachen HTML-Antworten ... oder irgendetwas anderem.
Jeroen Landheer
26

Wenn Sie ein typeanderes Skript-Tag als text/javascriptfestlegen, führt der Browser den internen Code des Skript-Tags nicht aus. Dies wird als Mikroschablone bezeichnet. Dieses Konzept wird häufig in Einzelseitenanwendungen (auch bekannt als SPA) verwendet.

<script type="text/template">I am a Micro template. 
  I am going to make your web page faster.</script>

Bei einer Mikrovorlage lautet der Typ des Skript-Tags text/template. Es ist sehr gut von JQuery Schöpfer John Resig erklärt http://ejohn.org/blog/javascript-micro-templating/

Fizer Khan
quelle
Tolle Ressource, die Sie aufgenommen haben. Dieser Link hat mir viel beigebracht.
Rocktheartsm4l
13

So fügen Sie die Antwort von Box9 hinzu:

Backbone.js ist abhängig von underscore.js, das selbst die ursprünglichen Mikrotemplates von John Resig implementiert.

Wenn Sie Backbone.js mit Rails verwenden möchten, sollten Sie sich unbedingt das Juwel Jammit ansehen. Es bietet eine sehr saubere Möglichkeit, die Asset-Verpackung für Vorlagen zu verwalten. http://documentcloud.github.com/jammit/#jst

Standardmäßig verwendet Jammit auch die Mikrotemplates von JResig, aber Sie können auch die Template-Engine ersetzen.

Andrew De Andrade
quelle
Außerdem ist DocumentCloud, das Jammit bereitstellt, dasselbe Unternehmen, das Backbone und Underscore entwickelt hat.
Ceasar Bautista
12

Auf diese Weise können Sie HTML Text hinzufügen, ohne ihn zu rendern oder zu normalisieren.

Es ist nicht anders als das Hinzufügen wie folgt:

 <textarea style="display:none"><span>{{name}}</span></textarea>
Kernel James
quelle
32
Es ist anders, ein Textbereich fügt diese Elemente weiterhin in das DOM ein und ruft alle angeforderten externen Assets (wie Bilder) ab. Ein Skript-Tag wird nicht.
LocalPCGuy
13
@LocalPCGuy, das nicht wahr ist, auch nicht <img src="image.jpg">in einem Textbereich, führt nicht zum Abrufen image.jpgdes Browsers. Der Browser weiß, dass der Inhalt in einem Textbereich nicht zum Rendern gedacht ist.
Vikki
5
@vikki woops, Sie haben Recht, Textbereich kann eines der wenigen Elemente sein, die ein praktikabler Ersatz für das Erstellen von Skript-Tag-Vorlagen wären.
LocalPCGuy
4
@LocalPCGuy Ja, ich denke, diese beiden können interchangebly verwendet werden. Wenn Ihre Vorlage die Zeile enthält </script>, können Sie sie nicht in einem Skript-Tag verwenden, sodass Sie dann den Textbereich verwenden können und umgekehrt.
Vikki
2
Yup ... Vor dem Template-Tag und vor dem Skripttyp = Text / Template haben wir es alle mit Textarea gemacht, glaube ich. Das gleiche gilt für Iframes, als wir keinen Ajax hatten.
dkellner
11

<script type = “text/template”> … </script>ist obsolet. Verwenden Sie <template>stattdessen das Tag.

Reza Salarmehr
quelle
9
<template>Tag wird von Internet Explorer ab IE 11 immer noch nicht unterstützt.
Ovinophile
87
Verwenden Sie in 5 Jahren das <template> -Tag.
Superluminary
13
<script type = "text / template"> kann alles enthalten, sie werden nicht analysiert. Auf der anderen Seite werden <template> -Tags in ein DOM analysiert und müssen daher gültiges HTML enthalten. Normalerweise bedeutet dies, dass die erste als intakte Vorlage beibehalten wird, während die zweite nicht HTML-konforme Teile entfernt und die Vorlage beschädigt. ... natürlich ist es nur ein Problem, wenn Sie Template-Engines wie Schnurrbart oder ähnliches verwenden.
Dagnelies
10
Verwenden Sie NICHT das <template> -Tag und treffen Sie Ihre Entscheidung nicht, wenn etwas anderes "veraltet" ist. Dies ist nicht die Mailänder Modewoche, wenn etwas funktioniert und technisch angemessen ist, kann es verwendet werden :) Jetzt wirklich: Das <template> -Tag wird in IE und Opera Mini (laut CanIUse) immer noch nicht unterstützt, und das <script> -Tag wird es tun Halten Sie genau das, was Sie ihm geben, im Gegensatz zu einem versteckten Div oder einem anderen Tag, das Ihre Leerzeichen oder Kommentare verlieren könnte.
dkellner
3
2 Jahre nach der Veröffentlichung der Antwort ist IE11 selbst eine veraltete Technologie, und Microsoft hat stattdessen auf Edge umgestellt, der diese unterstützt <template>. Die meisten gängigen Desktop-Browser unterstützen dieses <template>Tag. Ich empfehle dringend, es ab sofort zu verwenden. developer.mozilla.org/en/docs/Web/HTML/Element/…
Yeo