您是不是需要在 <script> 标签中指定文本/javascript?
Posted
技术标签:
【中文标题】您是不是需要在 <script> 标签中指定文本/javascript?【英文标题】:Do you need text/javascript specified in your <script> tags?您是否需要在 <script> 标签中指定文本/javascript? 【发布时间】:2011-07-13 00:28:58 【问题描述】:我在某处读到您不再需要诸如 type="text/javascript"
之类的东西,以及脚本标签中奇怪的 CDATA
和 <!--
东西。所以,而不是:
<script type="text/javascript">
//<![CDATA[
<!--
//your script here
-->
//]]>
</script>
你会这样做:
<script>
//your script here
</script>
我不记得我在哪里读到的。我认为它来自谷歌或雅虎工程师,他们特别提到了哪些浏览器需要这些古老的结构以及原因。任何人都知道这是讨论了什么博客文章/文章,或者有一个很好的资源来讨论这个?
【问题讨论】:
对于新浏览器,但在较旧的浏览器上(如果仍然存在) 是必需的。关于某些应用中的类型如果没有省略,需要正确的。 关于 CDATA 的好读物:***.com/questions/66837/… 每次我打开一个指定text/javascript
的文件时,我都会删除它。是噪音。
一个非常相关的帖子here 在接受的答案中包含有关 html5 指南的最新信息。
【参考方案1】:
请参阅Crockford's write-up on the <script>
tag,最值得注意的是:
不要在脚本中使用
<!-- //-->
hack。它旨在防止脚本在第一代浏览器 Netscape 1 和 Mosaic 上显示为文本。多年来一直没有必要。<!-- //-->
应该表示 HTML 注释。注释应该被忽略,而不是编译和执行。另外,HTML cmets 不能包含--
,因此递减的脚本会出现 HTML 错误。
...
type="text/javascript"
此属性是可选的。从 Netscape 2 开始,所有浏览器的默认编程语言都是 JavaScript。在 XHTML 中,这个属性是必需的,也是不必要的。在 HTML 中,最好将其省略。浏览器知道该做什么。
【讨论】:
必需的和不必要的?我错过了什么吗? @Izkata,它是验证所必需的,但没有任何作用。 "浏览器知道该做什么" ...暂时。下周当 RubyScript(我作为例子编造的)普及并且每个人都穿裤子接受它时怎么样?这与使人们将文件命名为“_new”并使其他人困惑多年的短视思想相同。是“_new”吗?还是“_new_new”?还是“_newer”? IMO 是短视的。 @Slobaum,HTML5 规范声明它是defaults to JavaScript。如果有新的脚本类型,它们只会在支持规范中的默认值的新浏览器版本中实现。 如果RubyScript
流行起来,它将以.rbscript
结尾,浏览器也会相应地采取行动。【参考方案2】:
这是Crockford 的推荐。我知道我已经看到它在其他地方回响(也许是ppk?)。 HTML5 规范不需要它。
奇怪的是,使用“type”属性标记<script>
您不想想要评估的块变得有点au courant:
<script type='text/html-template'>
<div> this is a template </div>
</script>
通过提供一个奇怪的非 JavaScript 类型,您可以将原始文本填充到页面中,以供其他 JavaScript 代码使用(可能在 可以评估的脚本块中)。
【讨论】:
我无法完全理解。请解释一下,type="text/html"
到底是什么意思,text/javascript
是什么意思.. 谢谢
@tazotodua “文本/html”的含义并不重要;重要的是它不是 "text/javascript",浏览器会完全忽略<script>
块的内容。但是,<script>
将成为 DOM 的一部分,因此其他 JavaScript 代码可以找到它们并提取它们的内容。
这是一个有趣的技巧。不过,我不确定我会用它来做什么。
w3schools: In HTML5, the type attribute is no longer required for JavaScript. The default value is "application/javascript".
十年过去了(写作时间),在示例中使用诱饵类型实现的目标现在是使用<template>
标记的原生。只是奖金提示。【参考方案3】:
HTML5 不需要 type="text/javascript"
(它是默认值)。
CDATA
仅适用于 XHTML 页面,如果脚本中包含任何 HTML 字符(如“”)。
<!--
应该只用于旧版浏览器。
【讨论】:
【参考方案4】:type 属性标识嵌入在脚本元素中或通过元素的 src 属性引用的代码的脚本语言。这被指定为 MIME 类型;支持的 MIME 类型示例包括 text/javascript、text/ecmascript、application/javascript 和 application/ecmascript。
根据HTML 4.01 Specification
type 属性指定元素的脚本语言 内容并覆盖默认脚本语言。脚本 语言被指定为内容类型(例如,“text/javascript”)。 作者必须为此属性提供一个值。没有默认值 此属性的值。
但是在HTML5text/javascript
是默认类型,所以可以省略
type 属性给出了脚本的语言或格式 数据。如果属性存在,其值必须是有效的 MIME 类型。不得指定 charset 参数。默认值,即 如果该属性不存在,则使用“text/javascript”。
【讨论】:
换句话说,省略它可能会在不支持HTML5的旧浏览器中导致错误【参考方案5】:好吧,我想说没有人再使用text/javascript
,甚至缩小工具也可能会删除它......
事实上,Facebook SDK documentation 只指定了<script>
。
然而,
Google SDK documentation 还有text/javascript
。
Amazon SDK documentation 仍然有 text/javascript
。
Linkedin API documentation 仍然有 text/javascript
。
Instagram 仍在使用text/javascript
。
【讨论】:
【参考方案6】:您可能会想到this article here,其依赖项是脚本在 HTML5 中自动默认为 text/javascript,而非 HTML5 浏览器仍然希望您根据规范定义类型,尽管它们几乎总是会猜测文本/javascript 反正。
【讨论】:
【参考方案7】:我相信,由浏览器根据标题正确解释 script
块,而不是 type
属性。因此,要回答您的问题,现代浏览器不需要它(我说的是 IE7+、FF、Webkit)。如果您支持比这更旧的浏览器...我为您感到抱歉 =)
【讨论】:
别忘了中国拥有 385+ 百万用户,其中许多用户仍在使用 IE6。 netmarketshare.com/… 了解中国严格的互联网政策,您的网站可能永远无法访问他们=P 问题是关于内联脚本的,所以除了主页(可能是一些 HTML 内容类型)之外没有其他标题。无论如何,您是否有表明浏览器会考虑标头的来源(例如,如果您有普通的 并提供 VBScript 标头,是否有任何浏览器会将其解释为 VBScript) ?【参考方案8】:如果您将脚本标记放入 SVG,您必须指定 type 属性。它应该是"text/ecmascript"
而不是"text/javascript"
。
如果您的脚本是内联的(未链接的),您还需要将脚本主体包装在 CDATA 声明中。 SVG(和其他 XML 变体)的内联脚本样板因此是
<script type="text/ecmascript">
<![CDATA[
// your javascript code goes here
]]>
</script>
这些可能是“在野外”的特殊情况,但它们足够真实,并且 SVG 的使用正在增长,因此其他人认为 type 属性和 CDATA 在现代浏览器中完全过时是不正确的。用例很窄,是的,但并非闻所未闻。
“改变环境到它的对立面,每一条智慧都变成最愚蠢的。” - 阿什比
【讨论】:
好电话。刚刚研究了一些复杂的 SVG,确实是这样!【参考方案9】:?? HTML5 规范敦促作者省略该属性,而不是提供多余的 MIME 类型。 MDN
MIME Sniffing Standard 允许使用符合以下条件的任何 MIME 类型(多用途 Internet 邮件扩展)提供 JavaScript:
<script type="application/javascript"></script>
<script type="application/ecmascript"></script>
<script type="text/javascript"></script>
<script type="text/ecmascript"></script>
【讨论】:
【参考方案10】:好吧,我不断看到更多没有文本/javascript 的示例,但由于某种原因,当我这样做时,我的脚本无法在 FF 中运行。我建议保留 text/javascript 声明。如果您的浏览器关闭了 javascript,则 CDATA 标记可防止 javascript 在您的网站中显示为纯文本。就我个人而言,我不再使用这些标签了,不认为那里有很多用户没有,如果他们在那里,他们可能想培养一些大脑:P
【讨论】:
类型属性和旧的 CDATA 东西都不是必需的,除非你真的想针对真正的古董浏览器。只要您确实使用了正确的类型,它们就不会伤害任何东西。 我正在使用最新的稳定 FF 版本,如果没有声明 text/javascript,它似乎无法解析,我使用 jQuery 顺便说一句,但这不应该有所作为。 好吧,我使用纯<script>
的脚本标签运行我的整个Web 应用程序,没有“语言”和“类型”,它们在所有浏览器中都能正常工作。 (嗯,所有合理的:FF、Chrome、Safari、IE、Opera。)
@pointy 似乎FatherStorm 刚刚发布了为什么会发生这种情况的答案。所以你的 cmets 似乎不正确。
@Michael 如果您犯了使用 XHTML/Strict 的错误,您可能会遇到问题,但即便如此我也对此表示怀疑。 JavaScript 界的杰出人物普遍认为“类型”属性是不必要的,事实上,由于错误的“类型”会破坏脚本,它只是错误的来源。【参考方案11】:
type="text/javascript"
:在 HTML 4 和 XHTML 中是必需的,但在 HTML5 中是可选的。
CDATA
:在 XHTML 中是必需的。
<!--
:用于在非常旧的浏览器中隐藏 JavaScript。例如:Netscape 1 和 Internet Explorer 2,这两个都没有人再使用了。
【讨论】:
以上是关于您是不是需要在 <script> 标签中指定文本/javascript?的主要内容,如果未能解决你的问题,请参考以下文章
<script> 标签是不是受到与 javascript/fetch 调用相同的 CORS 限制?
我应该将 <script> 标签放在 HTML 标记中的啥位置?