Зачем писать ‹script type = text / javascript›, если тип mime установлен сервером?

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


person Christopher Altman    schedule 24.04.2010    source источник
comment
Серверы редко настраиваются должным образом.   -  person Gumbo    schedule 25.04.2010
comment
Также потому, что вы можете поместить туда любой тип, и если браузер может понять этот тип, он выполнит скрипт.   -  person    schedule 25.04.2010
comment
@ Гамбо: Правда? У вас есть доказательства (например, текст, содержащий статистику) для этого?   -  person Marcel Korpel    schedule 25.04.2010
comment
Также прочтите stackoverflow.com/questions/189850/   -  person Marcel Korpel    schedule 25.04.2010
comment
@Gumbo неудивительно, учитывая, что браузеры исторически снисходительны. Может, не стоило?   -  person Roman Starkov    schedule 19.07.2012
comment
@MarcelKorpel: Я только что заметил, что мой собственный сервер не может установить правильный MIME-тип для файлов .js. Итак, теперь по крайней мере один случай зарегистрирован для доказательства. OTOH, что редко в оригинальном заявлении Гамбо слишком пессимистично: я собираюсь исправить свое дерьмо прямо сейчас, так что квест все равно скоро снова останется открытым ...;)   -  person Sz.    schedule 11.03.2014


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

person brainjam    schedule 24.04.2010
comment
Это не соответствует спецификации HTML: w3.org/TR /html401/interact/scripts.html#adef-type-SCRIPT - person Marcel Korpel; 25.04.2010
comment
Что касается второй части: подробнее о типах MIME в RFC 4329: ietf.org/rfc/rfc4329. txt На самом деле вам действительно следует указать type="text/javascript", хотя многие серверы отправят файл с Content-type: application/javascript. - person Marcel Korpel; 25.04.2010
comment
Мне действительно интересно, что IE 6 будет делать с этими примерами. И да, по крайней мере 5-й (без type) будет работать в этом браузере. Это потому, что в большинстве браузеров есть резервные настройки на случай, если документ не соответствует стандартам; это не повод подавать нестандартные блюда или даже помечать суп. - person Marcel Korpel; 25.04.2010
comment
@Marcel Korpel, спасибо за ссылки на стандартные документы. Я сбит с толку (или, возможно, не внимательно читаю): ietf.org/rfc/rfc4329.txt не говорит Таким образом, этот документ определяет text/javascript и text/ecmascript, но отмечает их как устаревшие - person brainjam; 25.04.2010
comment
@Marcel Korpel, согласно IETester, IE6 принимает те же сценарии, что и IE8. - person brainjam; 25.04.2010
comment
Я тоже был сбит с толку, когда увидел это в первый раз. Просто разработчики RFC в своей полной мудрости решили стандартизировать application/javascript в пользу text/javascript, но первый просто не будет работать в некоторых браузерах (по крайней мере, в IE). Недавно в списке рассылки WHATWG обсуждалось значение по умолчанию type в HTML 5 по сравнению с RFC 4329: lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2010-April/ (также прочтите оставшуюся часть обсуждения). - person Marcel Korpel; 25.04.2010
comment
@Marcel: Я тестировал его в IE6, и только type=baloney работал :) - person Daniel Vassallo; 25.04.2010
comment
@ Даниэль: Приятно знать. :) С этого момента я буду использовать <!--[if IE 6]><script type=baloney>/* some evil crash code */</script><![endif]--> на своих страницах. en.wiktionary.org/wiki/ - person Marcel Korpel; 25.04.2010
comment
Почему «лучше» не указывать type="text/javascript" в HTML? - person Kyle Vassella; 06.09.2017

Поскольку, по крайней мере, в 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 файла, который получает Отправить). Недавно в списке рассылки WHATWG обсуждалось это несоответствие (в HTML 5 type по умолчанию text/javascript), прочтите эти сообщения с темой Будете ли вы рассматривать RFC 4329?

person Marcel Korpel    schedule 24.04.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.
   }
}
person Alohci    schedule 24.04.2010
comment
К вашему сведению, обратите внимание, что использование атрибута language устарело: w3.org/TR/html401/interact/scripts.html#adef-language - person Marcel Korpel; 25.04.2010

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

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

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

person Quentin    schedule 24.04.2010