<script type =“ text / template”>…</ script>的说明


456

我偶然发现了以前从未见过的东西。在Backbone.js的示例TODO应用程序(Backbone TODO Example)的源代码中,他们将模板<script type = "text/template"></script>包含在中,其中包含的代码看起来像PHP之外的东西,但带有JavaScript标签。

谁可以给我解释一下这个?这是合法的吗?


很好的问答。我只是在新的YUI应用程序框架代码中遇到了这个技巧:new.yuilibrary.com/yui/docs/app/app-todo.html
mjhm 2011年

4
怎么样type="text/tcl",我看到在W3C文档?如何使用它?(我应该问另一个问题吗?)
L01man 2012年

3
@ L01man是的,您应该问另一个问题。
Nate Glenn

mjhm的YUI链接现在位于:yuilibrary.com/yui/docs/app/app-todo.html
gpvos

Answers:


413

这些脚本标记是在客户端实现模板功能(如PHP)的常用方法。

通过将类型设置为“文本/模板”,它不是浏览器可以理解的脚本,因此浏览器将直接忽略它。这样,您就可以在其中放置任何内容,然后可以随后将其提取出来,并由模板库用于生成HTML代码段。

Backbone不会强迫您使用任何特定的模板库-那里有很多模板库:MustacheHamlEcoGoogle Closure模板等等(您链接到的示例中使用的模板underscore.js)。这些脚本将使用它们自己的语法在这些脚本标记中进行编写。


22
@Matt,就是这样。同时,使用再次轻松检索全文很容易.innerHTML,因此在模板引擎中现在已经很普遍了。
大卫·唐

1
嗯,这不仅是个好消息!我一直在寻找这样的解决方案。。感谢您的回复和跟进!
马特

7
嗨,这里的马特与众不同。<script type =“ text / template”>是否可以通过html验证测试?
马特


5
你好,未来。<template>在此处,但网站仍在使用这种技术,例如reddit.com。:F
Victor Zamanian

114

合法而且非常方便!

尝试这个:

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

一些Javascript模板库使用此技术。Handlebars.js是一个很好的例子。


5
您将如何使用jquery在原始javascript中发出此警报?
2013年

3
@tremor是指没有jquery的原始javascript吗?像这样:var el = document.getElementById('hello'); var html = el.textContent; alert(html); (您需要进一步研究IE中处理脚本标签的文本)
SgtPooki

@SgtPooki是的,我的意思是没有,谢谢您的回答。我真正想做的是将该脚本src保存到一个外部文件中并获取它,但是我发现这实际上是不可能的..因此,我现在开始研究AJAX和socket.io。
2013年

@tremor,我可能不太清楚您要执行的操作,但是绝对有可能动态获取外部文件以运行或解析为模板。查看requirejs。
SgtPooki

@tremor如果要动态提取外部文件,我宁愿使用XHR而不是脚本标签。XHR还可以使用简单的HTML响应……或与此相关的任何其他东西。
Jeroen Landheer 2015年

26

通过设置脚本标记type以外text/javascript,浏览器将不执行脚本标签的内部代码。这称为微型模板。此概念已在单页应用程序(又名SPA)中广泛使用。

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

对于微型模板,脚本标签的类型为text/template。jQuery创建者John Resig对此进行了很好的解释,网址为http://ejohn.org/blog/javascript-micro-templating/


您包括的丰富资源。该链接教会了我很多东西。
rocktheartsm4l

13

要添加到Box9的答案中:

Backbone.js依赖于underscore.js,后者本身实现了John Resig的原始微模板。

如果您决定将Backbone.js与Rails一起使用,请务必查看Jammit gem。它提供了一种非常干净的方法来管理模板的资产打包。 http://documentcloud.github.com/jammit/#jst

默认情况下,Jammit还使用JResig的微模板,但它也允许您替换模板引擎。


另外,提供Jammit的DocumentCloud与开发Backbone and Underscore的公司相同。
Ceasar Bautista

12

这是一种将文本添加到HTML而不进行渲染或标准化的方法。

就像添加它一样没有什么不同:

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

32
不同的是,textarea仍将那些元素插入DOM并获取请求的任何外部资产(例如图像)。脚本标记不会。
LocalPCGuy 2013年

13
@LocalPCGuy表示不正确,包括<img src="image.jpg">在textarea内不会导致浏览器获取image.jpg,浏览器知道textarea内的内容不是要呈现的。
vikki 2014年

5
@vikki,你是对的,textarea可能是可以替代脚本标签模板的少数元素之一。
LocalPCGuy 2014年

4
@LocalPCGuy是的,我认为这两个可以互换使用。如果模板包含该行</script>,则不能在script标记内使用它,因此可以使用textarea,反之亦然。
vikki 2014年

2
是的...我相信,在模板标记之前和脚本type = text / template之前,我们都使用textarea做到了。当我们没有ajax时,使用iframe也是一样。
dkellner

11

<script type = “text/template”> … </script>已过时。请改用<template>标签。


9
<template>标签还没有被Internet Explorer支持的IE 11
ovinophile

87
在5年内使用<template>标签。
superluminary 2014年

13
<script type =“ text / template”>可以容纳任何内容,但不进行解析。另一方面,<template>标记被解析为DOM,因此需要有效的HTML。通常,这意味着第一个将保留为完整的模板,而第二个将删除不符合html的部分并破坏该模板。...当然,如果您使用诸如胡须之类的模板引擎,这只是一个问题。
dagnelies 2014年

9
请勿使用<template>标记,也不要基于其他“过时”来做出决定。这不是米兰时装周,如果可以正常工作并且在技术上合适,可以使用它:)现在,真正的:IE和Opera Mini中仍然不支持<template>标签(根据CanIUse),并且<script>标签可以完全保留您提供的内容,而不是隐藏的div或任何其他可能丢失空格或注释的标签。
dkellner

3
自从发布答案以来已有2年了,IE11本身是一种过时的技术,而Microsoft已转而使用Edge来提供支持<template>。大多数主流的桌面浏览器都支持此<template>标记。我强烈建议从现在开始使用它。developer.mozilla.org/en/docs/Web/HTML/Element/...
杨荣文

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.