Коли використовувати JavaScript MIME типу application / javascript замість text / javascript?


157

На основі запитання код jQuery, який не працює в IE , text/javascriptвикористовується в документах HTML, щоб Internet Explorer міг це зрозуміти.

Але мені цікаво, коли б ви використовували application/javascript, і що ще важливіше, чому б ви використовували його замість text/javascript?


можлива дупа / пояснення: stackoverflow.com/questions/876561/…
Benn

Дивіться також stackoverflow.com/questions/2325571/…
Gumbo


Відповіді:


243

У теорії, в відповідно до RFC 4329 , application/javascript.

Причина, якою це повинно бути application, не має нічого спільного з тим, чи є тип читабельним чи виконуваним. Це тому, що існують спеціальні механізми визначення діаграм, встановлені самим мовою / типом, а не просто загальним charsetпараметром. Підтип textповинен бути здатний перекодувати проксі-сервер до іншого шаблону, змінивши параметр charset. Це неправда JavaScript, тому що:

а. RFC говорить, що користувачеві агенти повинні робити BOM-нюхати сценарій для визначення типу (я не впевнений, чи якісь браузери насправді роблять це)

б. браузери використовують іншу інформацію - включаючи кодування сторінки та атрибут - у деяких браузерах script charset- для визначення шаблону. Отже, будь-який проксі, який намагався перекодувати ресурс, зламав би його користувачів. (Звичайно, насправді ніхто ніколи не використовує перекодування проксі, але це був намір.)

Тому точні байти файлу повинні зберігатися точно , що робить його бінарним applicationтипом, а не технічно заснованим на символах text.

З цієї ж причини application/xmlофіційно віддано перевагу над text/xml: XML має власні механізми сигналізації в діапазоні діапазонів. І всі ігнорують applicationXML.

text/javascriptі це text/xmlможе бути не офіційною правильною річчю, але є те, що кожен сьогодні використовує з міркувань сумісності, а причини, чому вони не є правильними, практично абсолютно не важливі.


4
Найбільш «сумісність» рішення - взагалі не включати будь-який тип вмісту у відповідь. RFC стверджує, що без явного типу вмісту одержувач інтерпретуватиме його "за контекстом", що завжди є правильною поведінкою для всіх браузерів з найперших браузерів
Pacerier

Будьте обережні, application/javascriptі IE працює в режимі сумісності з IE=8. Здається, що вбудовані сценарії не оцінені належним чином. text/javascriptтам чудово працює.
Джоша

2
@Pacerier - Я знаю, що цьому коментарю 5 років, але сьогодні з міркувань безпеки найчастіше найкраще включати типи мімів, особливо для веб-сайтів типу форуму. Якщо інтерпретатор приймача типу залишає відкритим для атаки, завантажуючи шкідливий файл JavaScript у вигляді зображення, а потім браузер інтерпретує та запускає цей сценарій. Краще мати типи mime для сервера для всіх відповідей та використовувати заголовок, X-Content-Type-Options: nosniffщоб браузер не інтерпретував тип.
sammy_winter

@sammy_winter Я скрізь бачу такі попередження, і кожен раз стискається. Якби я дозволив користувачам завантажувати вміст, я, мабуть, зробив би більш валідацію, ніж "о так, назвіть відповідний регекс для png-файлу, я можу це повірити", чи не так? Якщо неправильний заголовок стає "проблемою безпеки", проблема, можливо, десь глибша, ви не думаєте? Це те саме, що і з приховуванням Server: nginxабо тим, що nginx надсилає. Ніби тому, хто здатний знайти дірку, потрібен чіткий заголовок, щоб знати, на якому сервері ти
працюєш

17

Проблема типу MIME Javascript полягає в тому, що не існує стандарту протягом багатьох років. Тепер у нас є програма / javascript як офіційний тип MIME.

Але насправді тип MIME зовсім не має значення, оскільки браузер може визначити сам тип. Ось чому в специфікаціях HTML5 зазначено, що цей type="text/javascript"файл більше не потрібен.


5

applicationтому що .js-Files - це не те, що користувач хоче прочитати, а те, що має бути виконано.


Це офіційна відповідь, але IE задавлюється на це.
Бенн

20
@Benn: Можливо тому, що користувачі IE повинні читати всі файли JS, оскільки вони не виконуються належним чином? Принаймні, це чесно Microsoft;)
thejh

Подобається ваш коментар, але, на жаль, люди, які не вміють читати JavaScript, все ще використовують IE, тому ми маємо мати справу з цим :(.
Марк Байєнс

1
Я не думаю, чи хочеш ти читати це чимось пов’язане з тим, чому. Це пов'язане з тим, як перекодуються дані, а точніше - чи вони можуть бути.
Zenexer

технічно HTML і CSS також "виконуються" (розбираються) браузером для отримання результату коду як візуального контенту і не призначені для користувача "читати" його, тому ця відповідь не має особливого сенсу. Я думаю, існує велика плутанина щодо того, що таке "текст" та що таке "додаток". Якби я міг проголосувати в цьому питанні, я б сказав, що IETF повинен розглядати "текстовий" вміст як text, або binaryяк або, або application"призначення" зазначеного типу, як "зображення", або "документ" тощо

1

application / javascript - це правильний тип використання, але оскільки він не підтримується IE6-8, ви будете застрягати з текстом / javascript. Якщо вас не хвилює дійсність (виключається HTML5), тоді просто не вказуйте тип.


Де ти це взяв? Я впевнений, що це підтримується. Або, принаймні, це буде проігноровано.
Zenexer

@Zenexer прочитав свою відповідь на інше питання . Здається, сумісність IE означає, що немає application/javascript.
Каміло Мартін

@CamiloMartin Я прекрасно використовую його з IE до 6, весь час. Вони просто за замовчуванням JavaScript.
Zenexer

@Zenexer Гм, дивно. Цікаво, в чому проблема була в інших запитаннях та питаннях.
Каміло Мартін

@Zenexer Минуло певний час, оскільки мені довелося зіткнутися з цим, але ось деякі інші відомості про це, що викликає проблеми з IE6-8. Не зовсім впевнений, чому це має значення лише кілька разів, але, на мій досвід, це спричинило проблеми.
Раду
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.