web-dev-qa-db-fra.com

Pourquoi écrire <script type = "text / javascript"> lorsque le type MIME est défini par le serveur?

Ma compréhension est que les types MIME sont définis par le serveur Web. Pourquoi ajoutons-nous le type="text/javascript ou type="text/css" attribut? N'est-ce pas un attribut inutile et ignoré?

63
Christopher Altman

Douglas Crockford dit :

type="text/javascript"

Cet attribut est facultatif. Depuis Netscape 2, le langage de programmation par défaut dans tous les navigateurs est JavaScript. En XHTML, cet attribut est requis et inutile. En HTML, il vaut mieux le laisser de côté. Le navigateur sait quoi faire.

Il dit aussi:

Le W3C n'a pas adopté l'attribut language, privilégiant plutôt un attribut type qui prend un type MIME. Malheureusement, le type MIME n'était pas standardisé, il est donc parfois "text/javascript" ou "application/ecmascript" ou autre chose. Heureusement, tous les navigateurs choisiront toujours JavaScript comme langage de programmation par défaut, il est donc toujours préférable d'écrire simplement <script>. Il est le plus petit et fonctionne sur la plupart des navigateurs.

À des fins de divertissement uniquement, j'ai essayé les cinq scripts suivants

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

Sur Chrome, tous sauf le script 3 (type="baloney") travaillé. IE8 n'a pas exécuté le script 1 (type="application/ecmascript") ou script 3. Sur la base de mon échantillon non exhaustif de deux navigateurs, il semble que vous pouvez ignorer l'attribut type en toute sécurité, mais que si vous l'utilisez, il vaut mieux utiliser une valeur légale (dépendante du navigateur) .

66
brainjam

Parce que, au moins en HTML 4.01 et XHTML 1 (.1), l'attribut type pour <script> éléments est obligatoire .

Dans HTML 5 , type n'est plus requis.

En fait, alors que vous devez utiliser text/javascript dans votre source HTML, de nombreux serveurs enverront le fichier avec Content-type: application/javascript. En savoir plus sur ces types MIME dans RFC 4329 .

Notez la différence entre RFC 4329, qui marquait text/javascript comme obsolète et recommandant l'utilisation de application/javascript, et la réalité dans laquelle certains navigateurs paniquent <script> éléments contenant type="application/javascript" (dans la source HTML, pas l'en-tête HTTP Content-type du fichier qui est envoyé). Récemment, il y a eu une discussion sur la liste de diffusion WHATWG à propos de cette divergence (type par défaut de HTML 5 est text/javascript), lisez ces messages avec le sujet Envisagerez-vous de RFC 4329?

28
Marcel Korpel

Boris Zbarsky (Mozilla), qui en sait probablement plus sur les entrailles de Gecko que quiconque, a fourni à http://lists.w3.org/Archives/Public/public-html/2009Apr/0195.html = le pseudocode répété ci-dessous pour décrire ce que font les navigateurs basés sur 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.
   }
}
13
Alohci

Il permet aux navigateurs de déterminer s'ils peuvent gérer le langage de script/style avant de faire une demande pour le script ou la feuille de style (ou, dans le cas d'un script/style intégré, d'identifier la langue utilisée).

Cela serait beaucoup plus important s'il y avait eu plus de concurrence entre les langues dans l'espace du navigateur, mais VBScript n'a jamais dépassé IE et PerlScript n'a jamais dépassé un IE = plugin spécifique alors que JSSS était assez nul pour commencer.

Le brouillon de HTML5 rend l'attribut facultatif.

5
Quentin