【问题标题】:Why write <script type="text/javascript"> when the mime type is set by the server?为什么要在服务器设置 mime 类型时写 <script type="text/javascript"> ?
【发布时间】:2011-02-11 23:21:27
【问题描述】:

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

【问题讨论】:

  • 服务器很少被正确配置。
  • 也是因为你可以放任何类型,如果浏览器能够理解该类型,它就会执行脚本。
  • @Gumbo:真的吗?您对此有一些证据(即一些包含统计信息的文本)吗?
  • @Gumbo 并不奇怪,因为浏览器历来是宽松的。 Maybe they shouldn't have been?

标签: javascript html css mime-types


【解决方案1】:

因为,至少在 HTML 4.01 和 XHTML 1(.1) 中,&lt;script&gt; 元素的 type 属性是 required

HTML 5 中,不再需要type

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

请注意 RFC 4329 之间的区别,RFC 4329 将 text/javascript 标记为已过时并建议使用 application/javascript,而某些浏览器对包含 type="application/javascript"&lt;script&gt; 元素(在 HTML 源代码中,而不是被发送的文件的 HTTP 内容类型标头)。最近,在 WHATWG 邮件列表上讨论了这种差异(HTML 5 的 type 默认为 text/javascript),请阅读主题为 Will you consider about RFC 4329? 的这些邮件

【讨论】:

    【解决方案2】:

    Douglas Crockford says:

    type="text/javascript"

    此属性是可选的。自从 Netscape 2,默认编程 所有浏览器中的语言都是 JavaScript。在 XHTML 中,这个属性 是必需的和不必要的。在 HTML 中, 最好把它排除在外。这 浏览器知道该怎么做。

    He also says:

    W3C 没有采用language 属性,而不是type 采用 MIME 类型的属性。 不幸的是,MIME 类型不是 标准化,所以有时 "text/javascript""application/ecmascript" 什么的 别的。幸运的是,所有浏览器都会 始终选择 JavaScript 作为 默认编程语言,所以它是 总是最好简单地写&lt;script&gt;。 它是最小的,它适用于 大多数浏览器。

    仅出于娱乐目的,我尝试了以下五个脚本

      <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 属性,但是如果你使用它,你最好使用合法的(取决于浏览器)值。

    【讨论】:

    • 关于第二部分:阅读更多关于 RFC 4329 中 MIME 类型的信息:ietf.org/rfc/rfc4329.txt 事实上,您确实应该指定 type="text/javascript",尽管许多服务器会发送带有 Content-type 的文件:@987654337 @.
    • @Marcel Korpel,感谢您提供标准文档的链接。我很困惑(或者可能没有仔细阅读):ietf.org/rfc/rfc4329.txt 不是说 本文档因此定义了 text/javascripttext/ecmascript 但将它们标记为“过时”
    • @Marcel:我在 IE6 中测试过,只有 type=baloney 有效:)
    • @Daniel:很高兴知道。 :) 从现在开始,我将在我的页面上使用&lt;!--[if IE 6]&gt;&lt;script type=baloney&gt;/* some evil crash code */&lt;/script&gt;&lt;![endif]--&gt;en.wiktionary.org/wiki/…
    【解决方案3】:

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

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

    HTML5 草案使该属性成为可选的。

    【讨论】:

      【解决方案4】:

      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.
         }
      }
      

      【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 2011-07-28
      • 2014-11-02
      • 2012-01-16
      • 2012-07-28
      • 2019-12-21
      • 2021-01-26
      • 2021-02-15
      相关资源
      最近更新 更多