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?


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.


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


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.


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/


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.


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>

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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.