Chrome каже: "Ресурс інтерпретується як сценарій, але передається за допомогою тексту / простого типу MIME". Що дає?


316

У FF і все, мій JavaScript працює чудово. Але в Chrome він передає це повідомлення:

Ресурс інтерпретується як сценарій, але передається за допомогою тексту / простого типу MIME.

Я перевірив усі теги сценарію, і всі вони мають MIME type="text/javascript". Це навіть говорить про jquery та jquery ui. Що не так із Chrome?

У чому проблема та виправлення цього? Чи потрібно щось змінити у "параметрах" браузера чи це з сервера, чи мені потрібно підробити свій код?


14
Якийсь код буде корисним. Ніколи не звинувачуйте компілятор (браузер) спочатку незалежно від того, наскільки це спокусливо, тому що ви майже завжди помиляєтесь.
msw

Ви з цікавості використовуєте html5?
bollo

Відповіді:


203

Це означає, що сервер надсилає відповідь Javascript HTTP за допомогою

Content-Type: text/plain

Потрібно налаштувати сервер, щоб надсилати відповідь JavaScript

Content-Type: application/javascript

3
Я використовую Weblogic Server 11g, але не знаю, де в ньому можна налаштувати MIME. Будь ласка, чи можете мені показати шлях?
Шаоз

6
Хм, а як бути, коли немає сервера, але сценарій - це власне файл JSONP у вашій локальній файловій системі? Я думаю, тоді просто ігноруйте попередження, оскільки воно не є серйозним і не піддається вашому контролю?
hippietrail

2
Повинно бути , content-type:application/javascriptхоча, application/x-javascriptце НЕ RFC стандарт або ECMAScript.
Джасдіп Халса

Є багато подібних питань. Ця відповідь була для мене легким виправленням: stackoverflow.com/a/12057490/1617395
Джо Лео

@JoeLeo: Це для IIS.
СЛАкс

124

Це не має нічого спільного з jQuery або будь-якою химерністю коду сценарію на стороні клієнта. Це проблема на стороні сервера : сервер (додаткова програма) не надсилає очікуване значення Content-Typeполя заголовка HTTP для ресурсу сценарію на стороні клієнта. Це трапляється, якщо веб-сервер недостатньо налаштований, неправильно налаштований або програма на стороні сервера (наприклад, PHP) генерує ресурс сценарію на стороні клієнта.

Правильні типи мультимедійних файлів MIME для реалізації ECMAScript, такі як JavaScript, включають:

  • text/javascript(зареєстровано як застаріле , не застаріле; але все-таки дійсне та найкраще підтримується )
  • text/ecmascript(зареєстровано як застаріле , не застаріле; але все ще діє )
  • application/javascript
  • application/ecmascript

Вони не включають application/x-javascript, оскільки перераховані вище типи носіїв MIME є тими, які зареєстровані в дереві стандартів на даний момент (тому немає потреби та більше не потрібно використовувати експериментальні). Ср. RFC 4329, "Типи носіїв сценаріїв" (2005 р. CE) та мій тестовий випадок: Підтримка типів мультимедійних сценаріїв .

Одне рішення - налаштувати сервер, якщо це можливо, як це вже рекомендується. Для Apache це може бути так само просто, як додавання директиви

AddType text/javascript .js

(докладні відомості див. у документації Apache HTTP Server ).

Але якщо ресурс скрипта на стороні клієнта генерується додатком на сервері, як-от PHP, тоді слід встановити Content-Typeзначення поля заголовка явно, оскільки це за замовчуванням text/html:

<?php
  header('Content-Type: text/javascript; charset=UTF-8');
  // ...
?>

(Ці та подібні оператори повинні надходити перед будь-яким іншим результатом - див. Посібник PHP - інакше тіло повідомлень HTTP вважається розпочатим уже, і надто пізно надсилати більше полів заголовка.)

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


1
Що робити, якщо у нас немає доступу до сервера?
Адоніс К. Какулідіс

1
Знайдіть когось, хто має.
PointedEars

Велике спасибі за це пояснення. Занадто багато людей говорять про щось зухвалим, наприклад, "просто надішліть дитину JSONP, ви повинні знати, як це зробити". Коли потрібен час, щоб правильно пояснити це, як у вас, ясно, як день. Це вирішило проблему, яку я мав протягом декількох тижнів. Знову дякую!

@ Rick-777: Я не вдячний, що ти змінив мою відповідь, навіть не коментуючи свою зміну. Якщо ви уважно прочитаєте мою відповідь, то зрозумієте, чому я рекомендую text/javascriptперестати application/javascript. Якщо у вас є підстави вважати, що application/javascriptце краща відповідь зараз, то найменше, що вам слід зробити, - це пояснити себе в коментарі. Недоцільно, щоб він вимагав від мене механізму сповіщення Stack Overflow, щоб я дізнався про ваші зміни. Я повернув ваші зміни, які я називаю підробкою , на відповіді на це запитання, де вважаю їх недоречними.
Вказані вуха

19

Для серверів додатків Java, таких як Weblogic

1) Переконайтеся, що у вашому файлі weblogic.xml немає помилок

як ця:

    <?xml version = '1.0' encoding = 'windows-1252'?>
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">
    <container-descriptor>
        <prefer-web-inf-classes>true</prefer-web-inf-classes>
    </container-descriptor>
    <context-root>MyWebApp</context-root>
</weblogic-web-app>

2) Додайте тип mime для javascript у файл web.xml :

    ...
        </servlet-mapping>

        <mime-mapping>    
            <extension>js</extension>        
            <mime-type>application/javascript</mime-type>        
        </mime-mapping>

        <welcome-file-list>
    ...

Це також буде працювати для інших контейнерів Java - на application/javascriptданий момент Tomcat тощо є єдиним дійсним типом mime; інші на кшталт text/javascriptзастаріли.

3) Можливо, вам доведеться очистити кеш браузера або натиснути CTRL-F5


7

У мене була ця проблема, і я придумав, як її виправити.

Це трапляється, коли файл стилю (CSS) знаходиться в іншому кодуванні від файлу PHP, який посилається на файл .css

Наприклад, використання jQuery.js в кодуванні Unix та використання index.php в UTF-8 спричинить цю проблему, тому вам доведеться робити їх як UTF-8, так і будь-яке інше кодування, поки воно однакове.


7

Якщо ви генеруєте свій JavaScript за допомогою файлу php, додайте це як початок файлу:

<?php Header("Content-Type: application/x-javascript; charset=UTF-8"); ?>

Якщо у вас визначено інший заголовок, замініть його, щоб ви не отримали помилку.
мопсид

1
Поряд із повідомленням PointedEars, це допомогло мені виправити проблему, на яку, здавалося б, не було відповіді, і я ламаю мозок протягом тижнів. Велике спасибі: D Чому саме тоді, коли я набираю в google "як встановити заголовки в документі PHP", я отримую 1000 помилкових результатів, які нічого не говорять про те, як це зробити, я не знаю, але я нарешті знайшов ваш пост lol

3

У httpd.conf вашого apache просто додайте такий рядок:

AddType application/x-javascript .js

Мій запис " .js" мав "application / javascript" під IIS 8 MIME Type. Коли я змінив запис " .js" на "application / x-javascript", він працював! Це походить із програми ExtJS / ASP.NET / ExtDirect4DotNet
MacGyver

3

Я отримав це повідомлення про налагодження з дурнішої причини, ніж інші відповіді тут: Це повідомлення про помилку, отримане, коли ви не висипаєтесь та посилаєтесь на js-файл, використовуючи синтаксис для файлу css. А саме,

<link rel='stylesheet' type='text/css' href='clearly_javascript.js'/>

а не

<script src='clearly_javascript.js'></script>

Думав, я б це виклав тут, тому що це перша публікація, яка з’являється під час пошуку повідомлення про помилку.


2

Дивне питання, але це допомогло мені вирішити своє питання. Іноді навіть найлегші речі важко зрозуміти ...

Замість того, щоб використовувати /js/main.cssу своєму скрипті-тезі, я використовувавjs/main.css

Так , це насправді мало значення. Я сиджу на WAMP / Windows, і я не мав vhost, а просто використовувавсяlocalhost/<project>

Якщо я посилаюсь на це, /js/main.cssя посилаюся на, localhost/css/main.cssа не на цеlocalhost/<project>/css/main.css

Коли ви думаєте про це, це цілком очевидно, але якщо хтось натрапляє на це, я думав, що поділюсь цією відповіддю.


1

Перевірте, чи існують ваші js-файли на сервері. У мене виникла ця проблема, і я виявив, що файли js не завантажуються на сервер, а сервер фактично повертає сторінку html замість цього - який був налаштований на сервері документ за замовчуванням (наприклад, default.html)


1

Якщо ви працюєте над Joomla! і отримати цю прикрий помилку при спробі включити ( .js) JavaScript-файл, то наступне рішення для вас.

Найбільш вірогідна проблема полягає в тому, що ви намагаєтеся включити .js файл, якого немає , або ви просто неправильно помістили цей .jsфайл, і коли Joomla! не знаходить ресурс, то замість загального повідомлення 404 він повертає повноцінне повідомлення 404 із повною веб-сторінкою та html тощо.

Веб-браузер інтерпретує це як те, що .jsйого просто веб-сторінка говорить про те, що потрібний файл не знайдено .

Це може допомогти


1

Для мене це сталося лише на деяких сторінках, тому що я використовував window.locationзамість $location.url(...);цього виправлену проблему. Знадобився час, щоб розібратися :)


0

У мене виникла ця проблема під час користування веб-рамкою та виправлено її, перемістивши відповідні файли javascript у визначену папку javascript.


0

Типова річ, коли це відбувається - це ти просто забув включити typeв скрипт дзвінки. Вам доведеться встановити це чітко, як це - відповідно до W3 - потрібно :

type(тип вмісту): Цей атрибут визначає мову сценарію вмісту елемента і переосмислює мову сценаріїв за замовчуванням. Мова сценаріїв визначається як тип вмісту (наприклад, "text/javascript"). Автори повинні надати значення для цього атрибута. Для цього атрибуту немає значення за замовчуванням .

Але все-таки здається, що для браузерів встановлено стандартне значення plain/text.

Приклад:

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&language=en"></script>

Ви також можете встановити за замовчуванням для цього розширення файлу у вашій конфігурації Apache:

<IfModule mod_mime.c>
    AddType text/javascript .js
</IfModule>

0

Якщо його IIS переконайтеся , що під вашим common HTTP Featuresти Static Contentвключив


0

У мене була така ж помилка, і нарешті (в моєму конкретному випадку) я виявив проблему в дескрипторі розгортання (web.xml)

Проблема:

<servlet-mapping>
    <servlet-name>SessionController</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
...
<welcome-file-list>
    <welcome-file>/</welcome-file>
</welcome-file-list>

рішення:

<servlet-mapping>
    <servlet-name>SessionController</servlet-name>
    <url-pattern>/SessionController</url-pattern>
</servlet-mapping>
...
<welcome-file-list>
    <welcome-file>desktop.jsp</welcome-file>
</welcome-file-list>

0

Якщо ви використовуєте Spring MVC, ви можете додати наступний тег mvn, щоб виключити файл ресурсів із Spring Dispatch Servlet

<mvc:resources mapping="/js/*.js" location="/js/"/>
<mvc:resources mapping="/css/*.css" location="/css/"/>
<mvc:resources mapping="/images/*.*" location="/images/"/>

0

У моєму випадку сервер надсилав правильну, Content-Typeале неправильну Content-Encoding. Переконайтеся, що ви встановлюєте лише Content-Encoding: gzipдля gzipped ресурсів. Крім того, після того, як я зафіксував заголовки на сервері (у моєму випадку - Google Cloud Storage), мені довелося почекати кілька хвилин, щоб правильно відобразити зміни через кешування.


0

Якщо ви використовуєте AdonisJS (наприклад, API REST), один із способів уникнути цього - визначити заголовок відповіді таким чином:

response.safeHeader('Content-type', 'application/json')

-1

У мене виникло те саме питання, коли я намагався змінити фонові зображення в масиві через javascript (у цьому випадку jQuery).

Все одно.

Замість цього:

m.setStyle('background-image','url(/templates/site/images/style5/'+backgs[i]+')')

зробити це:

eval("m.setStyle('background-image','url(/templates/site/images/style5/'+backgs[i]+')')");

JavaScript javascript вкручується при спробі розбору змінної всередині елемента, структурованого з '. У моєму випадку він зупинився безпосередньо перед вставкою масиву зображень. Замість розбору URL-адреси зображення + імені зображення (всередині масиву) він аналізував лише URL-адресу зображення.

Вам, ймовірно, потрібно шукати всередині коду і подивитися, де це відбувається. FF, IE та всі інші не мають цієї проблеми.


4
Не використовуйте, evalякщо можете допомогти: javascripttoolbox.com/bestpractices/#eval
indra

-1

Відповідь відправив тут на Симона-Саррісом допоміг мені.

Це допомогло мені вирішити своє питання.

Установник Visual Studio повинен був додати запит до реєстру.

відкрийте regedit і подивіться на цей ключ реєстру:

введіть тут опис зображення

Бачите цей ключ? Ключ типу вмісту? змінити його значення з тексту / звичайного на текст / javascript.

Нарешті, хром може знову легко дихати.

Слід зазначити, що ні Тип вмісту, ні PercievedType за замовчуванням не існують у Windows 7, тому ви, ймовірно, можете безпечно видалити їх обидва, але мінімум, що вам потрібно зробити, це редагувати.

У будь-якому випадку я сподіваюся, що це виправить це і для вас!

Не забудьте перезапустити систему після змін.


Привіт ганьба. Плагіат - це погано. (mmmmkay?) Я відредагував вашу відповідь, щоб зняти плагіат відповідно до вказівок SO .
Самуель Хармер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.