Spiegazione di <script type = "text / template"> ... </script>


456

Mi sono appena imbattuto in qualcosa che non avevo mai visto prima. Nell'origine dell'applicazione TODO di esempio di Backbone.js (esempio TODO di backbone ) avevano i loro modelli all'interno di un file <script type = "text/template"></script>, che conteneva un codice che sembra uscito da PHP ma con tag JavaScript.

Qualcuno può spiegarmelo? È legittimo?


Ottima domanda e risposta. Ho appena incontrato questo trucco nel nuovo codice del framework dell'app YUI: new.yuilibrary.com/yui/docs/app/app-todo.html
mjhm

4
Che type="text/tcl"cosa ho visto nel documento W3C ? Come usarlo? (Devo fare un'altra domanda?)
L01man,

3
@ L01man sì, dovresti fare un'altra domanda.
Nate Glenn,

Il link YUI di mjhm ora su: yuilibrary.com/yui/docs/app/app-todo.html
gpvos

Risposte:


414

Quei tag di script sono un modo comune per implementare la funzionalità di template (come in PHP) ma sul lato client.

Impostando il tipo su "testo / modello", non è uno script che il browser può capire, quindi il browser semplicemente lo ignorerà. Ciò ti consente di inserire qualsiasi cosa, che può essere successivamente estratta e utilizzata da una libreria di modelli per generare frammenti HTML.

Backbone non ti costringe a usare nessuna particolare libreria di template - ce ne sono parecchi là fuori: Moustache , Haml , Eco , template di Google Closure e così via (quello usato nell'esempio a cui ti sei collegato è underscore.js ). Questi useranno la propria sintassi per scrivere all'interno di quei tag di script.


22
@Matt, esattamente quello. Allo stesso tempo è facile recuperare nuovamente il testo completo usando .innerHTML, quindi è pratica comune ora tra i motori di template.
David Tang,

1
Beh, non sono solo notizie fantastiche! Ho cercato una soluzione come questa .. Grazie per la risposta e il follow-up!
Matt,

7
ciao, diverso Matt qui. <Script type = "text / template"> supererebbe un test di verifica HTML?
Matt


5
Ciao dal futuro <template>è qui, ma i siti utilizzano ancora questa tecnica, come reddit.com. : F
Victor Zamanian,

114

È legittimo e molto utile!

Prova questo:

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

Diverse librerie di template Javascript utilizzano questa tecnica. Handlebars.js è un buon esempio.


5
Come faresti questo avviso in javascript non elaborato con jquery?
tremore

3
@tremor Intendi in javascript grezzo senza jquery? Qualcosa di simile: var el = document.getElementById ('hello'); var html = el.textContent; alert (html); (dovrai approfondire l'elaborazione del testo dei tag script in IE)
SgtPooki,

@SgtPooki ya intendevo senza, grazie per la risposta. Quello che mi piacerebbe davvero fare è src lo script su un file esterno e ottenerlo, ma ho scoperto che non è proprio possibile ... quindi mi sto tuffando in AJAX e socket.io ora.
tremore,

@tremor, potrei non capire esattamente cosa stai cercando di fare, ma è sicuramente possibile catturare file esterni dinamicamente, per eseguire o analizzare come modello. Dai un'occhiata a requestjs.
SgtPooki,

@tremor Se vuoi estrarre dinamicamente file esterni, preferirei usare XHR piuttosto che tag di script. XHR funziona anche con semplici risposte HTML ... o qualsiasi altra cosa.
Jeroen Landheer,

26

Impostando un tag di script typediverso da text/javascript, il browser non eseguirà il codice interno del tag di script. Questo si chiama micro modello. Questo concetto è ampiamente utilizzato nell'applicazione a pagina singola (aka SPA).

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

Per micro template, il tipo di tag script è text/template. È molto ben spiegato dal creatore di Jquery John Resig http://ejohn.org/blog/javascript-micro-templating/


Grande risorsa che hai incluso. Quel link mi ha insegnato molto.
rocktheartsm4l

13

Per aggiungere alla risposta di Box9:

Backbone.js dipende da underscore.js, che a sua volta implementa i microtemplate originali di John Resig.

Se decidi di utilizzare Backbone.js con Rails, assicurati di dare un'occhiata alla gemma Jammit. Fornisce un modo molto pulito per gestire il packaging delle risorse per i modelli. http://documentcloud.github.com/jammit/#jst

Per impostazione predefinita, Jammit utilizza anche i microtemplate di JResig, ma consente anche di sostituire il motore di template.


Per aggiungere, DocumentCloud, che fornisce Jammit, è la stessa società che ha sviluppato Backbone e Underscore.
Ceasar Bautista,

12

È un modo per aggiungere testo in HTML senza renderlo o normalizzare.

Non è diverso dall'aggiungerlo come:

 <textarea style="display:none"><span>{{name}}</span></textarea>

32
È diverso, un'area di testo inserirà comunque quegli elementi nel DOM e recupererà tutte le risorse esterne (come le immagini) richieste. Un tag script non lo farà.
LocalPCGuy

13
@LocalPCGuy non è vero, incluso <img src="image.jpg">all'interno di un'area di testo non causerà il recupero image.jpgdel browser, il browser sa che il contenuto all'interno di un'area di testo non è destinato al rendering.
Vikki,

5
@vikki woops, hai ragione, textarea potrebbe essere uno dei pochi elementi che sarebbe una valida alternativa al modello di tag script.
LocalPCGuy

4
@LocalPCGuy sì, penso che quei due possano essere usati in modo intercambiabile. Se il tuo modello ha la linea </script>non puoi usarlo all'interno di un tag script, quindi puoi usare textarea allora e viceversa.
Vikki,

2
Sì ... Prima del tag template e prima dello script type = text / template, lo abbiamo fatto tutti con textarea, credo. È la stessa cosa con iframe quando non avevamo ajax.
dkellner

11

<script type = “text/template”> … </script>è obsoleto. Usa <template>invece il tag.


9
<template>il tag non è ancora supportato da Internet Explorer a partire da IE 11.
ovinofilo il

87
Tra 5 anni usa il tag <template>.
superluminario,

13
<script type = "text / template"> può contenere qualsiasi cosa, non vengono analizzati. D'altro canto, i tag <template> vengono analizzati in un DOM, quindi è necessario un codice HTML valido. Di solito, ciò significa che il primo verrà mantenuto come modello intatto, mentre il secondo rimuoverà le parti non compatibili con HTML e interromperà il modello. ... ovviamente, è solo un problema se usi motori modello come baffi o simili.
Dagnelies,

10
NON utilizzare il tag <template> e non prendere la tua decisione in base a qualcos'altro che è "obsoleto". Questa non è la settimana della moda di Milano, se qualcosa funziona e tecnicamente appropriato, può essere utilizzata :) Ora davvero: il tag <template> non è ancora supportato in IE e Opera Mini (secondo CanIUse) e il tag <script> tieni esattamente quello che dai, al contrario di un div nascosto o di qualsiasi altro tag che potrebbe perdere spazi bianchi o commenti.
Dkellner,

3
A 2 anni dalla pubblicazione della risposta, IE11 stesso è una tecnologia obsoleta e Microsoft si è invece spostata su Edge, che supporta <template>. La maggior parte dei principali browser desktop ha supportato questo <template>tag. Consiglio vivamente di usarlo fin d'ora. developer.mozilla.org/en/docs/Web/HTML/Element/…
Yeo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.