您是不是需要在 <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&lt;!-- 东西。所以,而不是:

<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 &lt;script&gt; tag,最值得注意的是:

不要在脚本中使用&lt;!-- //--&gt; hack。它旨在防止脚本在第一代浏览器 Netscape 1 和 Mosaic 上显示为文本。多年来一直没有必要。 &lt;!-- //--&gt; 应该表示 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”属性标记&lt;script&gt;不想想要评估的块变得有点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",浏览器会完全忽略&lt;script&gt; 块的内容。但是,&lt;script&gt; 成为 DOM 的一部分,因此其他 JavaScript 代码可以找到它们并提取它们的内容。 这是一个有趣的技巧。不过,我不确定我会用它来做什么。 w3schools: In HTML5, the type attribute is no longer required for JavaScript. The default value is "application/javascript". 十年过去了(写作时间),在示例中使用诱饵类型实现的目标现在是使用&lt;template&gt; 标记的原生。只是奖金提示。【参考方案3】:

HTML5 不需要 type="text/javascript"(它是默认值)。

CDATA 仅适用于 XHTML 页面,如果脚本中包含任何 HTML 字符(如“”)。

&lt;!-- 应该只用于旧版浏览器。

【讨论】:

【参考方案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 只指定了&lt;script&gt;

然而, 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 顺便说一句,但这不应该有所作为。 好吧,我使用纯&lt;script&gt; 的脚本标签运行我的整个Web 应用程序,没有“语言”和“类型”,它们在所有浏览器中都能正常工作。 (嗯,所有合理的:FF、Chrome、Safari、IE、Opera。) @pointy 似乎FatherStorm 刚刚发布了为什么会发生这种情况的答案。所以你的 cmets 似乎不正确。 @Michael 如果您犯了使用 XHTML/Strict 的错误,您可能会遇到问题,但即便如此我也对此表示怀疑。 JavaScript 界的杰出人物普遍认为“类型”属性是不必要的,事实上,由于错误的“类型”会破坏脚本,它只是错误的来源。【参考方案11】:

type="text/javascript":在 HTML 4 和 XHTML 中是必需的,但在 HTML5 中是可选的。

CDATA:在 XHTML 中是必需的。

&lt;!-- :用于在非常旧的浏览器中隐藏 JavaScript。例如:Netscape 1 和 Internet Explorer 2,这两个都没有人再使用了。

【讨论】:

以上是关于您是不是需要在 <script> 标签中指定文本/javascript?的主要内容,如果未能解决你的问题,请参考以下文章

<script> 标签是不是受到与 javascript/fetch 调用相同的 CORS 限制?

为啥我需要在 HTML 中注释 <script> 标签?

脚本标记中何时需要CDATA部分?

我应该将 <script> 标签放在 HTML 标记中的啥位置?

javascript 函数在函数所在的script标签下为啥不能被调用

外部脚本必须包含 <script> 标签吗?