为什么要在服务器设置 mime 类型时编写 <script type="text/javascript"> ?

IT技术 javascript html css mime-types
2021-02-08 07:09:13

我的理解是 MIME 类型是由 Web 服务器设置的。为什么要添加type="text/javascriptortype="text/css"属性?这不是一个无用且被忽略的属性吗?

4个回答

道格拉斯·克罗克福德 说

type="text/javascript"

该属性是可选的。从 Netscape 2 开始,所有浏览器的默认编程语言都是 JavaScript。在 XHTML 中,这个属性是必需的,也是不必要的。在 HTML 中,最好将其排除在外。浏览器知道该做什么。

他还说:

W3C 没有采用该language 属性,而是倾向于type 采用 MIME 类型属性。不幸的是,MIME 类型没有标准化,所以它有时 "text/javascript""application/ecmascript"或其他东西。幸运的是,所有浏览器都会选择 JavaScript 作为默认编程语言,因此最好只编写<script>. 它是最小的,适用于大多数浏览器。

仅供娱乐,我尝试了以下五个脚本

  <script type="application/ecmascript">alert("1");</script>
  <script type="text/javascript">alert("2");</script>
  <script type="baloney">alert("3");</script>
  <script type="">alert("4");</script>
  <script >alert("5");</script>

在 Chrome 上,除了脚本 3 ( type="baloney") 之外的所有内容都可以工作。IE8 没有运行脚本 1 ( type="application/ecmascript") 或脚本 3。根据我对两个浏览器的非广泛示例,看起来您可以安全地忽略该type属性,但是如果您使用它,您最好使用合法的(依赖于浏​​览器的)值。

@Marcel Korpel,感谢提供标准文档的链接。我很困惑(或可能不仔细阅读):不ietf.org/rfc/rfc4329.txt说这个文件从而定义text/javascripttext/ecmascript,但他们标记作为“过时”
2021-03-23 07:09:13
2021-04-03 07:09:13
关于第二部分:在 RFC 4329 中阅读有关 MIME 类型的更多信息:ietf.org/rfc/rfc4329.txt事实上,您确实应该指定type="text/javascript",尽管许多服务器会发送带有 Content-type: 的文件application/javascript
2021-04-03 07:09:13
@Marcel:我在 IE6 中测试过,只有成功的type=baloney:)
2021-04-12 07:09:13
@丹尼尔:很高兴知道。:) 从现在开始我将<!--[if IE 6]><script type=baloney>/* some evil crash code */</script><![endif]-->在我的页面上使用en.wiktionary.org/wiki/…
2021-04-12 07:09:13

因为,至少在 HTML 4.01 和 XHTML 1(.1) 中,元素type属性<script>必需的

HTML 5 中type不再需要。

事实上,虽然您应该text/javascript在 HTML 源代码中使用,但许多服务器会发送带有Content-type: application/javascript. RFC 4329 中阅读有关这些 MIME 类型的更多信息

请注意 RFC 4329(标记text/javascript为过时并推荐使用application/javascript)与某些浏览器对<script>包含的元素type="application/javascript"(在 HTML 源中,而不是发送的文件的 HTTP 内容类型标头)上的元素感到恐慌的现实之间的区别最近,在 WHATWG 邮件列表上有一个关于这个差异的讨论(HTML 5 的type默认为text/javascript),请阅读这些主题为您会考虑 RFC 4329 的邮件吗?

Boris Zbarsky(Mozilla),他可能比其他任何人都更了解 Gecko 的内脏,在http://lists.w3.org/Archives/Public/public-html/2009Apr/0195.html提供了下面重复的伪代码来描述基于 Gecko 的浏览器做什么:

if (@type not set or empty) {
   if (@language not set or empty) {
     // Treat as default script language; what this is depends on the
     // content-script-type HTTP header or equivalent META tag
   } else {
     if (@language is one of "javascript", "livescript", "mocha",
                             "javascript1.0", "javascript1.1",
                             "javascript1.2", "javascript1.3",
                             "javascript1.4", "javascript1.5",
                             "javascript1.6", "javascript1.7",
                             "javascript1.8") {
       // Treat as javascript
     } else {
       // Treat as unknown script language; do not execute
     }
   }
} else {
   if (@type is one of "text/javascript", "text/ecmascript",
                       "application/javascript",
                       "application/ecmascript",
                       "application/x-javascript") {
     // Treat as javascript
   } else {
     // Treat as specified (e.g. if pyxpcom is installed and
     // python script is allowed in this context and the type
     // is one that the python runtime claims to handle, use that).
     // If we don't have a runtime for this type, do not execute.
   }
}
仅供参考,请注意language不推荐使用该属性:w3.org/TR/html401/interact/scripts.html#adef-language
2021-04-08 07:09:13

它允许浏览器在请求脚本或样式表之前确定它们是否可以处理脚本/样式语言(或者,在嵌入式脚本/样式的情况下,确定正在使用哪种语言)。

如果浏览器领域的语言之间存在更多竞争,这将变得更加重要,但是 VBScript 从未超越 IE,而 PerlScript 从未超越 IE 特定插件,而 JSSS 一开始就相当垃圾。

HTML5 草案使该属性可选。