您是否需要在<script>标签中指定text/javascript?

175

我在某个地方读到过,现在不再需要像type="text/javascript"和奇怪的CDATA以及在脚本标签中使用<!--之类的内容了。因此,现在可以这样写:

<script type="text/javascript">
//<![CDATA[
<!--

    //your script here

-->
//]]>
</script>

你只需要执行以下代码:

<script>
    //your script here
</script>

我记不得在哪里读到的了。我认为是一位谷歌或雅虎工程师提到过,他们特别提到了哪些浏览器需要这些古老的构造以及原因。有人知道哪篇博客文章或文章谈到了这一点,或者有一个好的资源可以谈论这个吗?


对于新的浏览器,但对于旧的(如果仍然存在)需要使用<!-- -->。关于某些应用程序中的类型,如果未省略,则需要正确的类型。 - Bakudan
1
关于CDATA的好文章:https://dev59.com/1XVD5IYBdhLWcg3wKYP- - kapa
1
每次我打开一个指定为 text/javascript 的文件时,我都会将它删除。这只是噪音。 - The Muffin Man
这里有一篇非常相关的帖子链接,其中被接受的答案提供了关于HTML5指南的最新信息。 - RBT
11个回答

152

请参见Crockford关于<script>标签的说明,尤其是:

不要在脚本中使用<!-- //-->伪注释。它旨在防止在Netscape 1和Mosaic等第一代浏览器上将脚本显示为文本。这已经很多年没有必要了。<!-- //-->应该表示一个HTML注释。注释应该被忽略,而不是编译和执行。此外,HTML注释不能包括--,因此减量脚本有一个HTML错误。

...

type="text/javascript"

此属性是可选的。自Netscape 2以来,在所有浏览器中默认的编程语言为JavaScript。在XHTML中,此属性是必需的且不需要。在HTML中,最好将其省略。浏览器知道该做什么。


86
需要和不需要的都要吗?我有什么遗漏吗? - Izkata
18
@Izkata,这是为了验证而需要的,但它并没有任何影响。 - bdukes
15
"浏览器现在知道要做什么……但是下周如果RubyScript(我只是举例)流行起来,大家都会为采用它而犯愁。这种短视的想法与让人们将文件命名为“_new”并困扰其他人数年的想法相同。是“_new”吗?还是“_new_new”?还是“_newer”?依我看,这是一种短视的做法。" - Slobaum
23
根据HTML5规范,如果没有指定脚本类型,它将默认为JavaScript。如果有新的脚本类型,只有支持规范默认值的新版浏览器才会实现这些新类型。 - bdukes
8
如果RubyScript变得流行,它将以.rbscript结尾,并且浏览器将相应地执行。 - Kirk Strobeck
显示剩余16条评论

48

这是Crockford的建议。我知道在其他地方也看到过(也许是ppk?)。 HTML5规范并不要求它。

奇怪的是,现在使用"type"属性来标记你不想要执行的 <script>块已经变得有些时髦了:

<script type='text/html-template'>
  <div> this is a template </div>
</script>

通过提供一个奇怪的非JavaScript类型,您可以获得一种将纯文本塞入页面以供其他JavaScript代码使用的方法(这些代码可能位于可评估的script块中)。


我无法完全理解。请解释一下,type="text/html" 是什么意思,text/javascript 又是什么意思。谢谢。 - T.Todua
4
@tazotodua,"text/html" 的意思并不是非常重要;重要的是它不是"text/javascript",浏览器会完全忽略<script>块的内容。但是,<script>将成为DOM的一部分,因此其他JavaScript代码可以找到它们并提取其内容。 - Pointy
这是一个有趣的技巧。虽然我不确定我会用它来做什么。 - brennanyoung
2
在HTML5中,JavaScript不再需要type属性。默认值为“application/javascript”。 - Amin Soheyli
十年已经过去(写作时的时间),在使用诱饵类型的示例中所实现的功能现在可以通过<template>标签本地化实现。这只是一个额外的提示。 - Niki Romagnoli
@TechNyquist 是的,没错,但是一个 <template> 区块的内容必须是有效的;而 <script type=text> 的内容可以是任何东西,比如 JSON,或者一个部分 HTML 的段落等。 - Pointy

19

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

CDATA 仅在XHTML页面中需要,如果脚本中有任何HTML字符(如'<'和'>')。

<!-- 只需要在旧浏览器中使用。


4
type 属性用于标识 script 元素中嵌入的代码或通过元素的 src 属性引用的脚本语言。它是一个 MIME 类型,支持的 MIME 类型包括 text/javascript、text/ecmascript、application/javascript 和 application/ecmascript。
根据 HTML 4.01 规范

type 属性指定了元素内容的脚本语言并覆盖了默认的脚本语言。脚本语言以内容类型(例如 "text/javascript")的形式指定。作者必须为此属性提供一个值。此属性没有默认值。

但在 HTML5 中,text/javascript 是默认类型,因此可以省略。

type 属性指定了脚本或数据的格式。如果存在该属性,则其值必须是有效的 MIME 类型。不得指定 charset 参数。如果不存在该属性,则使用默认值 "text/javascript"。


1
换句话说,省略它可能会导致旧浏览器无法支持HTML5而出现错误。 - serge

3

2
你可能正在思考的是这篇文章,其中的依赖关系是在HTML5中脚本默认为text/javascript,而非HTML5浏览器仍然期望你明确定义类型规范,尽管它们几乎总是会猜测text/javascript。

2
HTML5规范建议作者省略属性而不是提供冗余的MIME类型。MDN MIME嗅探标准允许使用任何与以下匹配的MIME类型(多用途互联网邮件扩展),来提供JavaScript服务:
<script type="application/javascript"></script>
<script type="application/ecmascript"></script>

<script type="text/javascript"></script>
<script type="text/ecmascript"></script>

1
如果您在SVG中放置脚本标签,必须指定 type 属性。它应该是 "text/ecmascript" 而不是 "text/javascript"
如果您的脚本是内联的(非链接),则还需要将脚本主体包装在 CDATA 声明中。因此,SVG(以及其他 XML 变体)的内联脚本样板如下所示:
<script type="text/ecmascript">
<![CDATA[
// your javascript code goes here
]]>
</script>

这些可能是“野外”中的特殊情况,但它们确实存在,而且SVG的使用正在增长,因此其他人认为type属性和CDATA在现代浏览器中完全过时是不正确的。使用案例是狭窄的,是的,但并非闻所未闻。
“改变环境到相反的状态,每一条智慧都会变成最糟糕的愚蠢。”-阿什比

1
干得好。我刚刚在处理一些复杂的SVG,确实是这种情况! - Dave Everitt

1

浏览器根据头部信息来正确解释 script 块,而不是 type 属性。所以回答你的问题,现代浏览器(我指的是IE7+、FF、Webkit)不需要这个属性。如果你要支持比这更老的浏览器...我为你感到难过 =)


2
不要忘记中国,有超过3.85亿的用户,其中许多人仍在使用IE6。http://www.netmarketshare.com/report.aspx?qprid=88&sample=51&qpmr=1000 - chainwork
3
了解中国的严格互联网政策,很可能您的网站永远也无法被他们访问到。 =P - hellatan
问题是关于内联脚本的,所以除了主页面(可能是一些HTML内容类型)之外没有其他头部。无论如何,你有什么来源表明浏览器会考虑头部吗?例如,如果你有一个普通的<script src="something"></script>并提供了一个VBScript头部,是否有任何浏览器会将其解释为VBScript? - Matthew Flaschen

0

我看到越来越多的例子没有使用text/javascript,但是当我这样做时,我的脚本在FF中无法工作。我建议保留text/javascript声明。CDATA标记可以防止在浏览器关闭javascript的情况下将javascript显示为纯文本。个人而言,我不再使用这些标记,因为我认为很少有用户没有启用javascript,如果他们确实存在,他们可能需要增强一些大脑 :P


除非你真的想针对真正古老的浏览器,否则类型属性和旧的CDATA不是必需的。但只要你确实使用正确的类型,它们不应该会有任何问题。 - Pointy
1
@pointy 看起来 FatherStorm 刚刚发布了一个关于为什么会发生这种情况的答案。所以你的评论似乎是不正确的。 - Michael
@pointy,我正在研究这个主题,似乎你是对的。我没有使用XHTML,所以不应该有问题,可能只是巧合,我在代码中打错了一个字母,然后注意到我没有声明类型。修复了这两个问题,我认为添加声明部分就是解决方案。从现在开始,我将放弃它,看看会发生什么。 - Michael
好的 - 就像我一开始说的那样,如果它是正确的值,它肯定不会有任何问题,但我喜欢让我的页面保持简洁,不要有不必要的东西 :-) - Pointy
Crockford先生说:“这个属性是可选的。自从Netscape 2以来,所有浏览器中的默认编程语言都是JavaScript。在XHTML中,这个属性是必需的但不必要。在HTML中最好不要使用它,浏览器知道该怎么做。”尽管如此,我每天仍在学习新的东西,谢谢大家 :) - Michael
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接