Chrome cho biết, Resource Resource được hiểu là tập lệnh nhưng được chuyển bằng văn bản / đơn giản loại MIME., Điều gì mang lại?


316

Trong FF và tất cả, javascript của tôi hoạt động tốt. Nhưng trong Chrome, nó cung cấp thông báo này:

Tài nguyên được hiểu là tập lệnh nhưng được chuyển bằng văn bản / loại MIME.

Tôi đã kiểm tra tất cả các thẻ script và tất cả chúng đều có MIME type="text/javascript". Nó thậm chí còn nói như vậy với jquery và jquery ui. Có chuyện gì với Chrome vậy?

Vấn đề và cách khắc phục vấn đề này là gì? Đây có phải là thứ tôi phải thay đổi trong 'tùy chọn' của trình duyệt hay là từ máy chủ, hay tôi phải điều chỉnh mã của mình?


14
Một số mã sẽ hữu ích. Không bao giờ đổ lỗi cho trình biên dịch (trình duyệt) trước cho dù nó hấp dẫn đến mức nào vì hầu như bạn sẽ luôn bị nhầm lẫn.
msw

như một vấn đề tò mò, bạn có đang sử dụng html5 không?
bollo

Câu trả lời:


203

Điều đó có nghĩa là máy chủ đang gửi phản hồi HTTP Javascript với

Content-Type: text/plain

Bạn cần định cấu hình máy chủ để gửi phản hồi JavaScript với

Content-Type: application/javascript

3
Tôi đang sử dụng Máy chủ Weblogic 11g, nhưng tôi không biết tôi có thể định cấu hình MIME trong đó ở đâu. Xin vui lòng, bạn có thể chỉ cho tôi đường?
Shaoz

6
Hmm, còn khi không có máy chủ, nhưng tập lệnh thực sự là một tệp JSONP trên hệ thống tệp cục bộ của bạn thì sao? Tôi đoán sau đó chỉ cần bỏ qua cảnh báo vì nó không nghiêm trọng và nằm ngoài tầm kiểm soát của bạn?
hà mã

2
Nó phải là content-type:application/javascriptmặc dù, application/x-javascriptkhông một RFC tiêu chuẩn hoặc ECMAScript.
Jasdeep Khalsa

Có rất nhiều câu hỏi tương tự. Câu trả lời này là một sửa chữa dễ dàng cho tôi: stackoverflow.com/a/12057490/1617395
Joe Leo

@JoeLeo: Đó là cho IIS.
SLaks

124

Điều này không có gì để làm với jQuery hoặc bất kỳ sự giải thích nào về mã tập lệnh phía máy khách. Đây là sự cố phía máy chủ : Máy chủ (ứng dụng bên) không gửi giá trị Content-Typetrường tiêu đề HTTP dự kiến cho tài nguyên tập lệnh phía máy khách. Điều này xảy ra nếu máy chủ Web không được cấu hình đầy đủ, cấu hình sai hoặc ứng dụng phía máy chủ (ví dụ: PHP) đang tạo tài nguyên tập lệnh phía máy khách.

Các loại phương tiện MIME phù hợp để triển khai ECMAScript như JavaScript bao gồm:

  • text/javascript(đã đăng ký là lỗi thời , không phản đối; nhưng vẫn hợp lệđược hỗ trợ tốt nhất )
  • text/ecmascript(đã đăng ký là lỗi thời , không được phản đối; nhưng vẫn còn hiệu lực )
  • application/javascript
  • application/ecmascript

Chúng không bao gồm application/x-javascript, vì các loại phương tiện MIME được liệt kê ở trên là những loại được đăng ký trong cây tiêu chuẩn (vì vậy không có nhu cầu và không cần sử dụng loại thử nghiệm nữa). Cf. RFC 4329, "Các loại phương tiện tập lệnh" (2005 CE) và Trường hợp thử nghiệm của tôi : Hỗ trợ cho các loại phương tiện tập lệnh .

Một giải pháp là cấu hình máy chủ nếu có thể, như đã khuyến nghị. Đối với Apache, điều này có thể đơn giản như việc thêm lệnh

AddType text/javascript .js

(xem tài liệu về Máy chủ HTTP Apache để biết chi tiết).

Nhưng nếu tài nguyên tập lệnh phía máy khách được tạo bởi ứng dụng phía máy chủ, như PHP, thì cần phải đặt Content-Typegiá trị trường tiêu đề một cách rõ ràng, vì có khả năng mặc định là text/html:

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

(Điều đó và các câu lệnh tương tự phải đến trước bất kỳ đầu ra nào khác - xem hướng dẫn sử dụng PHP -, phần khác, phần thân thông điệp HTTP được coi là đã bắt đầu và đã quá muộn để gửi thêm các trường tiêu đề.)

Việc tạo phía máy chủ có thể dễ dàng xảy ra với tài nguyên tập lệnh phía máy khách ngay cả khi bạn có tệp .js đơn giản trên máy chủ, nếu các bình luận bị xóa khỏi chúng khi chúng được phục vụ, nếu tất cả chúng được đóng gói vào một phản hồi lớn (để giảm số lượng yêu cầu, có thể hiệu quả hơn) hoặc chúng được tối thiểu hóa bởi ứng dụng phía máy chủ theo bất kỳ cách nào khác.


1
Nếu chúng ta không có quyền truy cập vào máy chủ thì sao?
Adonis K. Kakoulidis

1
Tìm ai đó có.
PointedEars

Cảm ơn rất nhiều cho lời giải thích này. Có quá nhiều người nói điều gì đó vênh váo như 'chỉ cần gửi đứa trẻ JSONP, bạn nên biết cách làm điều đó'. Khi thời gian được thực hiện để giải thích chính xác như bạn có, nó rõ ràng như ngày. Điều này đã khắc phục một vấn đề tôi đã có trong vài tuần. Cảm ơn một lần nữa!

@ Rick-777: Tôi không đánh giá cao việc bạn thay đổi câu trả lời của mình mà không bình luận về thay đổi của bạn. Nếu bạn đọc câu trả lời của tôi một cách cẩn thận, bạn sẽ nhận ra lý do tại sao tôi đề nghị text/javascripthơn application/javascript. Nếu bạn có lý do để tin rằng đó application/javascriptlà câu trả lời tốt hơn bây giờ, thì điều tối thiểu bạn nên làm là giải thích chính mình trong một bình luận. Điều không phù hợp là nó yêu cầu cơ chế thông báo của Stack Overflow để tôi nhận thức được các thay đổi của bạn. Tôi đã hoàn nguyên các thay đổi của bạn, mà tôi gọi là fudging , cho các câu trả lời cho câu hỏi này khi tôi cho rằng chúng không phù hợp.
PointedEars 27/05/2015

19

Đối với các máy chủ Ứng dụng Java như Weblogic

1) Đảm bảo tệp weblogic.xml của bạn không có lỗi

Giống như cái này:

    <?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) Thêm một loại mime cho javascript vào tệp web.xml của bạn :

    ...
        </servlet-mapping>

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

        <welcome-file-list>
    ...

Điều này cũng sẽ hoạt động cho các bộ chứa Java khác - Tomcat, v.v. application/javascripthiện là loại mime hợp lệ duy nhất; những người khác như text/javascriptđã bị phản đối

3) Bạn có thể cần xóa bộ nhớ cache của trình duyệt hoặc nhấn CTRL-F5


7

Tôi đã có vấn đề này và tôi đã tìm ra cách khắc phục nó.

Nó xảy ra khi tệp kiểu (CSS) ở dạng mã hóa khác với tệp PHP tham chiếu tệp .css

Ví dụ: sử dụng jQuery.js trong mã hóa Unix và sử dụng index.php trong UTF-8 sẽ gây ra sự cố này, do đó bạn phải tạo cả hai UTF-8 hoặc bất kỳ mã hóa nào khác miễn là giống nhau.


7

Nếu bạn đang tạo javascript của mình bằng tệp php, hãy thêm tệp này làm phần đầu của tệp:

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

Nếu bạn có một tiêu đề khác được xác định, hãy thay thế nó để bạn không gặp lỗi.
mopsyd

1
Cùng với bài viết của PointedEars, điều này đã giúp tôi khắc phục một vấn đề mà dường như không có câu trả lời và tôi đã làm phiền não trong nhiều tuần. Cảm ơn rất nhiều: D Tại sao khi tôi gõ vào google "cách đặt tiêu đề trong tài liệu PHP" Tôi nhận được 1000 kết quả sai mà không cho tôi biết gì về cách làm như vậy tôi không biết, nhưng cuối cùng tôi đã tìm thấy bài đăng của bạn lol

3

Trong httpd.conf của apache, chỉ cần thêm một dòng như vậy:

AddType application/x-javascript .js

Mục nhập ".js " của tôi có "application / javascript" trong IIS 8 MIME Type. Khi tôi thay đổi mục " .js" thành "application / x-javascript", nó đã hoạt động! Điều này bắt nguồn từ một ứng dụng ExtJS / ASP.NET / ExtDirect4DotNet
MacGyver

3

Tôi đã nhận được thông báo gỡ lỗi này vì lý do sillier hơn các câu trả lời khác ở đây: Đây là thông báo lỗi nhận được khi bạn không ngủ đủ giấc và tham chiếu tệp js bằng cách sử dụng cú pháp cho tệp css. Như trong

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

thay vì

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

Tôi nghĩ rằng tôi đã đặt nó lên đây vì đây là bài viết đầu tiên xuất hiện khi tìm kiếm thông báo lỗi.


2

Vấn đề kỳ lạ, nhưng điều này đã giúp tôi giải quyết vấn đề của mình. Đôi khi ngay cả những điều dễ nhất cũng khó để tìm ra ...

Thay vì sử dụng /js/main.csstrong thẻ script của tôi, tôi đã sử dụngjs/main.css

ĐÚNG , nó thực sự đã làm cho một sự khác biệt. Tôi đang ngồi trên WAMP / Windows và tôi không có vhost mà chỉ sử dụnglocalhost/<project>

Nếu tôi tham khảo /js/main.cssthì tôi tham khảolocalhost/css/main.css và khônglocalhost/<project>/css/main.css

Khi bạn nghĩ về nó, nó khá rõ ràng nhưng nếu ai đó vấp phải điều này tôi nghĩ tôi sẽ chia sẻ câu trả lời này.


1

Kiểm tra các tập tin js của bạn thực sự tồn tại trên máy chủ. Tôi gặp vấn đề này và phát hiện ra các tệp js đã không được tải lên máy chủ và máy chủ thực sự đang trả lại trang html thay vào đó - đó là tài liệu mặc định được định cấu hình trên máy chủ (ví dụ default.html)


1

Nếu bạn đang làm việc trên Joomla! và nhận được lỗi khó chịu này khi cố gắng bao gồm .jstệp JavaScript ( ), thì giải pháp sau đây là dành cho bạn.

Vấn đề có thể xảy ra nhất là bạn đang cố gắng đưa vào một .js tệp không có ở đó hoặc bạn đã đặt nhầm chỗ đó.js tệp và khi Joomla! không tìm thấy tài nguyên, sau đó thay vì thông báo 404 chung, nó trả về một thông báo 404 đầy đủ với một trang web hoàn chỉnh và html, v.v.

Trình duyệt web được giải thích nó như .jskhi nó chỉ là một trang web nói rằng các tập tin cần thiết không được tìm thấy .

Điều này có thể làm việc cho


1

Đối với tôi, nó chỉ xảy ra trên một số trang vì tôi đã sử dụng window.locationthay vì $location.url(...);Điều này đã khắc phục vấn đề của tôi. Mất một lúc để tìm ra :)


0

Tôi gặp vấn đề này trong khi sử dụng khung web và khắc phục bằng cách di chuyển các tệp javascript có liên quan vào thư mục javascript được chỉ định (theo khung).


0

Một điều phổ biến khi điều này xảy ra là nếu bạn chỉ đơn giản là quên đưa typevào các lệnh gọi tập lệnh của mình. Bạn sẽ phải thiết lập nó một cách rõ ràng, vì nó là - theo W3 - bắt buộc :

type(loại nội dung): Thuộc tính này chỉ định ngôn ngữ kịch bản của nội dung của phần tử và ghi đè ngôn ngữ kịch bản mặc định. Ngôn ngữ kịch bản được chỉ định làm loại nội dung (ví dụ "text/javascript":). Tác giả phải cung cấp một giá trị cho thuộc tính này. Không có giá trị mặc định cho thuộc tính này.

Tuy nhiên, dường như các trình duyệt có giá trị mặc định là plain/text.

Thí dụ:

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

Bạn cũng có thể đặt mặc định cho phần mở rộng tệp đó trong cấu hình Apache của mình:

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

0

Nếu IIS của nó đảm bảo rằng Theo bạn, common HTTP Featuresbạn đã Static Contentbật


0

Tôi đã có cùng một lỗi và cuối cùng (trong trường hợp cụ thể của tôi) tôi đã tìm thấy một vấn đề trong bộ mô tả triển khai (web.xml)

Vấn đề:

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

giải pháp:

<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

Nếu bạn đang sử dụng Spring MVC, bạn có thể thêm thẻ mvn sau để loại trừ tệp tài nguyên khỏi Spring Dispatch Servlet

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

0

Trong trường hợp của tôi, máy chủ đã gửi đúng Content-Typenhưng không chính xác Content-Encoding. Hãy chắc chắn rằng bạn chỉ đặt Content-Encoding: gzipcho các tài nguyên được nén. Ngoài ra, sau khi tôi sửa các tiêu đề trong máy chủ (trong trường hợp của tôi là Google Cloud Storage), tôi đã phải chờ vài phút để phản ánh đúng các thay đổi do bộ nhớ đệm.


0

Nếu bạn đang sử dụng AdonisJS (ví dụ API REST), một cách để tránh điều này là xác định tiêu đề phản hồi theo cách này:

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

-1

Tôi đã gặp vấn đề tương tự khi cố gắng thay đổi hình nền trong một mảng thông qua javascript (jQuery trong trường hợp này).

Dù sao.

Thay vì điều này:

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

làm cái này:

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

Chrome javascript bị vặn khi cố phân tích một biến trong một phần tử có cấu trúc '. Trong trường hợp của tôi, nó dừng lại ngay trước khi mảng hình ảnh được chèn vào. Thay vì phân tích url hình ảnh + tên hình ảnh (bên trong mảng), nó chỉ phân tích cú pháp url hình ảnh.

Bạn có thể cần phải tìm kiếm bên trong mã và xem nó xảy ra ở đâu. FF, IE và tất cả những người khác không có vấn đề này.


4
Đừng sử dụng evalnếu bạn có thể giúp nó: javascripttoolbox.com/bestpractices/#eval
indra

-1

Câu trả lời được đăng ở đây bởi simon-sarris đã giúp tôi.

Điều này giúp tôi giải quyết vấn đề của mình.

Trình cài đặt Visual Studio phải có thêm một dòng sai lầm vào sổ đăng ký.

mở regedit và xem mã đăng ký này:

nhập mô tả hình ảnh ở đây

Thấy chìa khóa đó không? Phím Loại nội dung? thay đổi giá trị của nó từ văn bản / thuần túy thành văn bản / javascript.

Cuối cùng chrome có thể thở dễ dàng một lần nữa.

Tôi nên lưu ý rằng cả Nội dung và PercperedType đều không có ở đó trên Windows 7, vì vậy bạn có thể xóa cả hai một cách an toàn, nhưng điều tối thiểu bạn cần làm là chỉnh sửa đó.

Dù sao, tôi hy vọng điều này sẽ sửa nó cho bạn quá!

Đừng quên khởi động lại hệ thống của bạn sau khi thay đổi.


Chào giả. Đạo văn là xấu. (mmmmkay?) Tôi đã chỉnh sửa câu trả lời của bạn để xóa đạo văn theo hướng dẫn của SO .
Samuel Harmer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.