Chrome mówi „Zasób interpretowany jako skrypt, ale przesłany za pomocą tekstu / zwykłego typu MIME”. Co daje?

316

W FF i całym moim javascript działa dobrze. Ale w Chrome wyświetla ten komunikat:

Zasób interpretowany jako skrypt, ale przesyłany za pomocą tekstu / zwykłego typu MIME.

Sprawdziłem wszystkie tagi skryptu i wszystkie mają MIME type="text/javascript". Mówi to nawet z jquery i jquery ui. Co jest nie tak z Chrome?

Na czym polega problem i naprawa? Czy to jest coś, co muszę zmienić w „opcjach” przeglądarki, czy to jest z serwera, czy też muszę poprawić mój kod?

Shaoz
źródło
14
Przydałby się trochę kodu. Nigdy nie obwiniaj kompilatora (przeglądarki) jako pierwszego, bez względu na to, jak kuszące, ponieważ prawie zawsze będziesz w błędzie.
msw
z ciekawości, czy używasz HTML5?
bollo

Odpowiedzi:

203

Oznacza to, że serwer wysyła odpowiedź HTTP JavaScript

Content-Type: text/plain

Musisz skonfigurować serwer, aby wysyłał odpowiedź JavaScript

Content-Type: application/javascript
SLaks
źródło
3
Używam Weblogic Server 11g, ale nie wiem, gdzie mogę w nim skonfigurować MIME. Czy możesz mi wskazać drogę?
Shaoz,
6
Hmm, a co jeśli nie ma serwera, ale skrypt jest w rzeczywistości plikiem JSONP w lokalnym systemie plików? Chyba po prostu zignoruj ​​to ostrzeżenie, ponieważ nie jest poważne i jest poza twoją kontrolą?
hippietrail,
2
Powinno być content-type:application/javascriptjednak application/x-javascriptto nie RFC standardowy lub ECMAScript.
Jasdeep Khalsa
Istnieje wiele podobnych pytań. Ta odpowiedź była dla mnie łatwa: stackoverflow.com/a/12057490/1617395
Joe Leo
@JoeLeo: To dla IIS.
SLaks,
124

Nie ma to nic wspólnego z jQuery ani jakimkolwiek dziwactwem kodu skryptu po stronie klienta. Jest to problem po stronie serwera : serwer (aplikacja po stronie) nie wysyła oczekiwanej wartości Content-Typepola nagłówka HTTP dla zasobu skryptu po stronie klienta. Dzieje się tak, jeśli serwer WWW jest niedostatecznie skonfigurowany, źle skonfigurowany lub aplikacja po stronie serwera (np. PHP) generuje zasób skryptu po stronie klienta.

Odpowiednie typy mediów MIME dla implementacji ECMAScript, takich jak JavaScript, obejmują:

  • text/javascript(zarejestrowany jako przestarzały , nieaktualny; ale nadal ważny i najlepiej obsługiwany )
  • text/ecmascript(zarejestrowany jako przestarzały , nieaktualny; ale nadal ważny )
  • application/javascript
  • application/ecmascript

Oni nie należą application/x-javascript, jak MIME typy mediów wymienione powyżej są te zarejestrowane w standardach drzewa już (więc nie ma potrzeby, i nie powinno być żadnych Kupię, aby korzystać z nich już eksperymentalne). Por. RFC 4329, „Scripting Media Types” (2005 CE) i mój przypadek testowy: obsługa typów skryptów .

Jednym z rozwiązań jest skonfigurowanie serwera, jeśli to możliwe, jak już zalecono. W przypadku Apache może to być tak proste, jak dodanie dyrektywy

AddType text/javascript .js

(szczegóły w dokumentacji serwera HTTP Apache ).

Ale jeśli zasób skryptu po stronie klienta jest generowany przez aplikację po stronie serwera, taką jak PHP, konieczne jest Content-Typejawne ustawienie wartości pola nagłówka, ponieważ prawdopodobne jest ustawienie domyślne text/html:

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

(Te i podobne instrukcje muszą pojawić się przed jakimkolwiek innym wyjściem - patrz instrukcja PHP - w przeciwnym razie treść wiadomości HTTP uważa się za już rozpoczętą i jest za późno, aby wysłać więcej pól nagłówka).

Generowanie po stronie serwera może łatwo przydarzyć się zasobowi skryptu po stronie klienta, nawet jeśli na serwerze znajdują się zwykłe pliki .js, jeśli komentarze zostaną z nich usunięte podczas ich dostarczania, jeśli wszystkie zostaną spakowane w jedną dużą odpowiedź (aby zmniejszyć liczba żądań, które mogą być bardziej wydajne) lub są one minimalizowane przez aplikację po stronie serwera w jakikolwiek inny sposób.

PointedEars
źródło
1
Co jeśli nie mamy dostępu do serwera?
Adonis K. Kakoulidis,
1
Znajdź kogoś, kto ma.
PointedEars,
Wielkie dzięki za to wyjaśnienie. Zbyt wiele osób mówi coś zarozumiałego, na przykład „po prostu wyślij JSONP, powinieneś wiedzieć, jak to zrobić”. Kiedy przyjmiesz czas, aby wyjaśnić to dokładnie tak, jak Ty, będzie to jasne jak w dzień. To rozwiązało problem, który miałem przez kilka tygodni. Dzięki jeszcze raz!
@ Rick-777: Nie doceniam, że zmieniasz moją odpowiedź, nawet nie komentując twojej zmiany. Jeśli uważnie przeczytasz moją odpowiedź, zrozumiesz, dlaczego polecam text/javascriptponad application/javascript. Jeśli masz powody, by sądzić, że application/javascriptjest to lepsza odpowiedź, to przynajmniej powinieneś zrobić to wyjaśnić się w komentarzu. To niewłaściwe, że wymaga mechanizmu powiadamiania o przepełnieniu stosu, aby uzyskać informację o twoich zmianach. Cofnęłam twoje zmiany, które nazywam kręceniem , do odpowiedzi na to pytanie, w których uważam je za niewłaściwe.
PointedEars
19

Dla serwerów aplikacji Java, takich jak Weblogic

1) Upewnij się, że plik weblogic.xml jest wolny od błędów

jak ten:

    <?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) Dodaj typ MIME dla javascript do pliku web.xml :

    ...
        </servlet-mapping>

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

        <welcome-file-list>
    ...

Będzie to działać również w przypadku innych kontenerów Java - Tomcat itp. application/javascriptJest obecnie jedynym prawidłowym typem MIME; inni jak text/javascriptbyli przestarzali.

3) Może być konieczne wyczyszczenie pamięci podręcznej przeglądarki lub naciśnięcie CTRL-F5

egallardo
źródło
7

Miałem ten problem i wymyśliłem, jak go naprawić.

Dzieje się tak, gdy plik stylu (CSS) ma inne kodowanie niż plik PHP, który odwołuje się do pliku .css

Na przykład użycie pliku jQuery.js w kodowaniu uniksowym i użycie pliku index.php w UTF-8 spowoduje ten problem, więc musisz ustawić je zarówno UTF-8, jak i dowolne inne kodowanie, o ile jest takie samo.

mak
źródło
7

Jeśli generujesz skrypt javascript z plikiem php, dodaj go jako początek pliku:

<?php Header("Content-Type: application/x-javascript; charset=UTF-8"); ?>
mopsyd
źródło
Jeśli masz zdefiniowany inny nagłówek, zamień go, aby nie pojawił się błąd.
mopsyd,
1
Wraz z postem PointedEars pomogło mi to naprawić problem, który najwyraźniej nie miał odpowiedzi i od tygodni pracowałem nad mózgiem. Wielkie dzięki: D Dlaczego to jest, kiedy wpisuję w Google „jak ustawić nagłówki w dokumencie PHP” Otrzymuję 1000 błędnych wyników, które nie mówią mi nic o tym, jak to zrobić, nie wiem, ale w końcu znalazłem twój post lol
3

W httpd.conf twojego apache, po prostu dodaj taką linię:

AddType application/x-javascript .js
Ruslan Abuzant
źródło
Mój wpis „ .js” zawierał „application / javascript” w ramach typów MIME IIS 8. Kiedy zmieniłem wpis .js” na „application / x-javascript”, zadziałało! Pochodzi z aplikacji ExtJS / ASP.NET / ExtDirect4DotNet
MacGyver
3

Otrzymałem ten komunikat debugowania z głupszego powodu niż inne odpowiedzi tutaj: Jest to komunikat o błędzie otrzymany, gdy nie masz wystarczającej ilości snu i odwołujesz się do pliku js przy użyciu składni pliku css. Jak w,

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

zamiast

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

Pomyślałem, że umieszczę to tutaj, ponieważ jest to pierwszy post, który pojawia się podczas wyszukiwania komunikatu o błędzie.

Robert Townley
źródło
2

Dziwny problem, ale pomogło mi to rozwiązać problem. Czasami nawet najłatwiejsze rzeczy trudno wymyślić ...

Zamiast używać /js/main.cssw skrypcie tagu, którego użyłemjs/main.css

TAK , to naprawdę miało znaczenie. Siedzę na WAMP / Windows i nie miałem vhosta, tylko go użyłemlocalhost/<project>

Jeśli odnoszę się do, /js/main.cssto odnoszę się do, localhost/css/main.cssa nie dolocalhost/<project>/css/main.css

Kiedy myślisz o tym, jest to dość oczywiste, ale jeśli ktoś się na to natknie, pomyślałem, że podzielę się tą odpowiedzią.

bestprogrammerintheworld
źródło
1

Sprawdź, czy pliki js faktycznie istnieją na serwerze. Miałem ten problem i odkryłem, że pliki js nie zostały przesłane na serwer, a serwer faktycznie zwracał stronę HTML - który był domyślnym dokumentem skonfigurowanym na serwerze (np. Default.html)

Steve Mc
źródło
1

Jeśli pracujesz nad Joomla! i otrzymanie tego irytującego błędu przy próbie dołączenia ( .js) pliku JavaScript, poniższe rozwiązanie jest dla Ciebie.

Najbardziej prawdopodobnym problemem jest to, że próbujesz dołączyć .js plik, którego nie ma , lub po prostu zgubiłeś ten .jsplik i kiedy Joomla! nie znajduje zasobu, a następnie zamiast ogólnego komunikatu 404, zwraca pełnowartościowy komunikat 404 z pełną stroną internetową i HTML itp.

Przeglądarka internetowa interpretuje to jako .jszwykłą stronę internetową informującą, że nie znaleziono wymaganego pliku .

To może zadziałać

Mohd Abdul Mujib
źródło
1

Dla mnie stało się to tylko na niektórych stronach, ponieważ użyłem window.locationzamiast $location.url(...);tego Naprawiłem mój problem. Długo to wymyśliłem :)

tfa
źródło
0

Miałem ten problem podczas korzystania z frameworka i naprawiłem go, przenosząc odpowiednie pliki javascript do wyznaczonego (przez framework) folderu javascript.

JJ.
źródło
0

Częstą rzeczą jest, gdy tak się dzieje, jeśli po prostu zapomniałeś uwzględnić typew swoich wywołaniach skryptu. Musisz to ustawić jawnie, ponieważ jest to - zgodnie z W3 - wymagane :

type(content-type): ten atrybut określa język skryptowy zawartości elementu i zastępuje domyślny język skryptowy. Język skryptowy jest określony jako typ zawartości (np "text/javascript".). Autorzy muszą podać wartość tego atrybutu. Nie ma wartości domyślnej dla tego atrybutu.

Nadal wydaje się, że przeglądarki mają domyślną wartość plain/text.

Przykład:

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

Równie dobrze możesz ustawić domyślne dla tego rozszerzenia pliku w konfiguracji Apache:

<IfModule mod_mime.c>
    AddType text/javascript .js
</IfModule>
kajzer
źródło
0

Jeśli jest to IIS, upewnij się, common HTTP Featuresże został Static Contentwłączony

varun
źródło
0

Miałem ten sam błąd i wreszcie (w moim konkretnym przypadku) znalazłem problem w deskryptorze wdrażania (web.xml)

Problem:

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

rozwiązanie:

<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>
Daniel Kennedy
źródło
0

Jeśli używasz Spring MVC, możesz dodać następujący znacznik mvn, aby wykluczyć plik zasobów z serwletu Spring Dispatch

<mvc:resources mapping="/js/*.js" location="/js/"/>
<mvc:resources mapping="/css/*.css" location="/css/"/>
<mvc:resources mapping="/images/*.*" location="/images/"/>
sendon1982
źródło
0

W moim przypadku serwer wysyłał poprawne, Content-Typeale niepoprawne Content-Encoding. Upewnij się, że ustawiłeś tylko Content-Encoding: gzipdla spakowanych zasobów. Ponadto po naprawieniu nagłówków na serwerze (w moim przypadku Google Cloud Storage) musiałem poczekać kilka minut, aby odpowiednio odzwierciedlić zmiany wynikające z buforowania.

falsarella
źródło
0

Jeśli używasz AdonisJS (na przykład REST API), jednym ze sposobów uniknięcia tego jest zdefiniowanie nagłówka odpowiedzi w ten sposób:

response.safeHeader('Content-type', 'application/json')
Billal Begueradj
źródło
-1

Miałem ten sam problem przy próbie zmiany obrazów tła w tablicy za pomocą javascript (w tym przypadku jQuery).

Tak czy siak.

Zamiast tego:

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

Zrób to:

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

Chrome javascript zostaje wkręcony podczas próby analizy zmiennej wewnątrz elementu o strukturze „. W moim przypadku zatrzymał się tuż przed wstawieniem tablicy obrazów. Zamiast analizować adres URL obrazu + nazwę obrazu (wewnątrz tablicy), analizował tylko adres URL obrazu.

Prawdopodobnie będziesz musiał przeszukać kod i zobaczyć, gdzie to się dzieje. FF, IE i wszystkie inne nie mają tego problemu.

Marco G.
źródło
4
Nie używaj, evaljeśli możesz pomóc: javascripttoolbox.com/bestpractices/#eval
indra
-1

Odpowiedź zamieszczona tutaj przez simon-sarris pomogła mi.

To pomogło mi rozwiązać problem.

Instalator programu Visual Studio musiał dodać błędną linię do rejestru.

otwórz regedit i spójrz na ten klucz rejestru:

wprowadź opis zdjęcia tutaj

Widzisz ten klucz? Klucz typu zawartości? zmień jego wartość z text / plain na text / javascript.

W końcu chrom może znów swobodnie oddychać.

Powinienem zauważyć, że ani typ zawartości, ani PercievedType nie są domyślnie dostępne w systemie Windows 7, więc prawdopodobnie możesz bezpiecznie usunąć je oba, ale minimalną rzeczą, którą musisz zrobić, to ta edycja.

W każdym razie mam nadzieję, że to też rozwiązuje problem!

Nie zapomnij zrestartować systemu po zmianach.

pozorny
źródło
Cześć fikcja. Plagiat jest zły. (mmmmkay?) Zredagowałem twoją odpowiedź, aby usunąć plagiat zgodnie z wytycznymi SO .
Samuel Harmer