Зачем писать <script type = "text / javascript">, если тип mime установлен сервером? - PullRequest
62 голосов
/ 25 апреля 2010

Насколько я понимаю, типы пантомимы задаются веб-сервером. Почему мы добавляем атрибут type="text/javascript или type="text/css"? Разве это не бесполезный и игнорируемый атрибут?

Ответы [ 4 ]

65 голосов
/ 25 апреля 2010

Дуглас Крокфорд говорит :

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, но если вы его используете, вам лучше использовать (зависит от браузера).

27 голосов
/ 25 апреля 2010

Поскольку, по крайней мере, в HTML 4.01 и XHTML 1 (.1) атрибут type для элементов <script> равен , обязателен .

В HTML 5 , type больше не требуется.

На самом деле, хотя вы должны использовать text/javascript в своем источнике HTML, многие серверы будут отправлять файл с Content-type: application/javascript. Подробнее об этих типах MIME читайте в RFC 4329 .

Обратите внимание на разницу между RFC 4329, которая пометила text/javascript как устаревшую и рекомендующую использование application/javascript, и реальностью, в которой некоторые браузеры сходят с ума по <script> элементам, содержащим type="application/javascript" (в источнике HTML не заголовок HTTP Content-type файла, который получает send). Недавно в списке рассылки WHATWG было обсуждение этого несоответствия (в HTML 5 type по умолчанию text/javascript), прочитайте эти сообщения с темой Будете ли вы учитывать RFC 4329?

13 голосов
/ 25 апреля 2010

Борис Збарский (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.
   }
}
5 голосов
/ 25 апреля 2010

Это позволяет браузерам определить, могут ли они обрабатывать язык сценариев / стилей, прежде чем делать запрос на сценарий или таблицу стилей (или, в случае встроенного сценария / стиля, определить, какой язык используется).

Это было бы гораздо важнее, если бы в браузерной среде было больше конкуренции между языками, но VBScript никогда не выходил за пределы IE, а PerlScript никогда не выходил за рамки специфичного для IE плагина, в то время как JSSS был довольно глупым с самого начала.

Черновик HTML5 делает атрибут необязательным.

...