Bạn có cần văn bản / javascript được chỉ định trong thẻ <script> không?


156

Tôi đọc ở đâu đó rằng bạn không còn cần những thứ như type="text/javascript"và những điều kỳ lạ CDATA<!--những thứ trong thẻ script của bạn. Vì vậy, thay vì:

<script type="text/javascript">
//<![CDATA[
<!--

    //your script here

-->
//]]>
</script>

Bạn sẽ làm:

<script>
    //your script here
</script>

Tôi không thể nhớ nơi tôi đọc điều này mặc dù. Đó là từ một kỹ sư Google hoặc Yahoo tôi nghĩ, và họ đã đề cập cụ thể những trình duyệt nào yêu cầu các cấu trúc cổ xưa này và tại sao. Bất cứ ai cũng biết bài viết / bài viết trên blog này đã được nói đến, hoặc có một nguồn tài nguyên tốt nói về điều này?


Đối với các trình duyệt mới, nhưng trên cũ hơn (nếu vẫn còn tồn tại) <! - -> là cần thiết. Về loại trong một số ứng dụng nếu không bỏ qua, cần phải đúng.
Bakudan

1
Đọc tốt về CDATA: stackoverflow.com/questions/66837/ từ
kapa

1
Mỗi khi tôi mở một tập tin với text/javascriptchỉ định, tôi xóa nó. Đó là tiếng ồn.
Người đàn ông Muffin

Một bài đăng rất liên quan ở đây có thông tin cập nhật về các nguyên tắc HTML5 trong câu trả lời được chấp nhận.
RBT

Câu trả lời:


134

Xem phần ghi chú của Crockford trên <script>thẻ , đáng chú ý nhất là:

Không sử dụng <!-- //-->hack với các tập lệnh. Nó được dự định để ngăn các tập lệnh hiển thị dưới dạng văn bản trên các trình duyệt thế hệ đầu tiên Netscape 1 và Mosaic. Nó đã không cần thiết trong nhiều năm. <!-- //-->được cho là để báo hiệu một bình luận HTML. Bình luận nên được bỏ qua, không được biên soạn và thực hiện. Ngoài ra, không bao gồm các nhận xét HTML --, do đó, tập lệnh phân rã có lỗi HTML.

...

type="text/javascript"

Thuộc tính này là tùy chọn. Kể từ Netscape 2, ngôn ngữ lập trình mặc định trong tất cả các trình duyệt là JavaScript. Trong XHTML, thuộc tính này là bắt buộc và không cần thiết. Trong HTML, tốt hơn là bỏ nó đi. Trình duyệt biết phải làm gì.


75
Bắt buộc không cần thiết? Tui bỏ lỡ điều gì vậy?
Izkata

17
@Izkata, nó được yêu cầu để xác nhận, nhưng không có hiệu lực.
bdukes

14
"Trình duyệt biết phải làm gì" ... bây giờ. Điều gì về tuần tới khi RubyScript (tôi lấy ví dụ này làm ví dụ) được phổ biến và mọi người đều khao khát được chấp nhận nó? Đây là cùng một kiểu suy nghĩ thiển cận khiến mọi người đặt tên cho tệp của họ là "_new" và khiến người khác bối rối trong nhiều năm. Có phải là "_new"? Hoặc "_new_new"? Hoặc mới hơn"? IMO nó thiển cận.
Slobaum

17
@Slobaum, thông số HTML5 nói rằng nó mặc định là JavaScript . Nếu có các loại tập lệnh mới, chúng sẽ chỉ được triển khai trong các phiên bản trình duyệt mới hỗ trợ mặc định đó từ thông số kỹ thuật.
bdukes

8
nếu RubyScripttrở nên phổ biến, nó sẽ kết thúc .rbscriptvà trình duyệt sẽ hành động tương ứng.
Kirk Strobeck

45

Đó là một khuyến nghị của Crockford . Tôi biết tôi đã thấy nó lặp lại ở nơi khác (ppk có lẽ?). Thông số HTML5 không yêu cầu nó.

Nhưng kỳ lạ, nó đã trở thành hơi au Courant để sử dụng "loại" thuộc tính để đánh dấu <script>khối mà bạn không muốn được đánh giá:

<script type='text/html-template'>
  <div> this is a template </div>
</script>

Bằng cách đưa ra một loại không phải JavaScript lạ, bạn có thể đưa văn bản thô vào trang để sử dụng bởi mã JavaScript khác (có lẽ được đánh giá trong khối tập lệnh có thể được đánh giá).


Tôi không thể hiểu đầy đủ. vui lòng giải thích, điều đó type="text/html"có nghĩa là gì, và điều đó text/javascriptcó nghĩa là gì .. cảm ơn
T.Todua

4
@tazotodua nó thực sự không quan trọng lắm "text / html" nghĩa là gì; điều quan trọng là nó không phải là "văn bản / javascript", các trình duyệt sẽ hoàn toàn bỏ qua nội dung của <script>khối. Tuy nhiên, <script> sẽ trở thành một phần của DOM, vì vậy mã JavaScript khác có thể tìm thấy chúng và trích xuất nội dung của chúng.
Pointy

Đó là một hack thú vị. Không chắc chắn những gì tôi sử dụng nó cho, mặc dù.
brennanyoung

2
w3schools : In HTML5, the type attribute is no longer required for JavaScript. The default value is "application/javascript".
Amin Soheyli

19

HTML5 không cần type="text/javascript"(đó là mặc định).

CDATA chỉ được xem cho các trang XHTML, nếu tập lệnh có bất kỳ ký tự HTML nào (như '<' và '>') trong đó.

<!-- chỉ nên cần thiết cho các trình duyệt OLD.



3

Các loại thuộc tính xác định ngôn ngữ kịch bản mã nhúng trong một yếu tố kịch bản hoặc tham chiếu thông qua thuộc tính src của phần tử. Điều này được chỉ định là một loại MIME; ví dụ về các loại MIME được hỗ trợ bao gồm văn bản / javascript, văn bản / ecmascript, application / javascript và application / ecmascript.

Theo đặc tả HTML 4.01

Các loại thuộc tính xác định ngôn ngữ kịch bản các nội dung của phần tử và đè ngôn ngữ kịch bản mặc định. Ngôn ngữ kịch bản được chỉ định là một loại nội dung (ví dụ: "văn bản / 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.

Nhưng trong HTML5 text/javascript là loại mặc định, vì vậy bạn có thể bỏ qua

Các loại thuộc tính cho ngôn ngữ của kịch bản hoặc định dạng của dữ liệu. Nếu thuộc tính có mặt, giá trị của nó phải là loại MIME hợp lệ. Tham số bộ ký tự không được chỉ định. Mặc định, được sử dụng nếu thuộc tính vắng mặt, là "văn bản / javascript".


1
nói cách khác, bỏ qua nó có thể gây ra lỗi trong các trình duyệt cũ không hỗ trợ HTML5
Serge

2

bạn có thể nghĩ về bài viết này ở đây với sự phụ thuộc là các tập lệnh mặc định là văn bản / javascript trong HTML5, trong khi các trình duyệt không phải là HTML5 vẫn mong bạn xác định loại cụ thể cụ thể mặc dù chúng hầu như sẽ luôn đoán văn bản / javascript .


1

scriptTôi tin rằng trình duyệt sẽ giải thích chính xác khối dựa trên các tiêu đề, tôi tin chứ không phải typethuộc tính. Vì vậy, để trả lời câu hỏi của bạn, không cần thiết cho các trình duyệt hiện đại (tôi đang nói IE7 +, FF, Webkit). Nếu bạn đang hỗ trợ các trình duyệt cũ hơn thế ... Tôi cảm thấy tiếc cho bạn =)


2
Đừng quên Trung Quốc với hơn 385 triệu người dùng, nhiều người trong số họ vẫn sử dụng IE6. netmarketshare.com/ từ
chainwork

3
biết chính sách internet nghiêm ngặt của Trung Quốc, rất có thể trang web của bạn sẽ không bao giờ tiếp cận được với họ = P
hellatan

Câu hỏi là về một tập lệnh nội tuyến, vì vậy không có tiêu đề nào ngoài trang chính (sẽ là một số loại nội dung HTML). Dù sao, bạn có nguồn nào cho biết các trình duyệt có tính đến các tiêu đề không (ví dụ: nếu bạn có <script src = "Something"> </ script> đơn giản và đã phục vụ một tiêu đề VBScript, thì có bất kỳ trình duyệt nào sẽ hiểu nó là VBScript) ?
Matthew Flaschen

1

Nếu bạn đặt thẻ script bên trong SVG, bạn phải chỉ định thuộc tính loại. Và nó nên được "text/ecmascript"chứ không phải là"text/javascript" .

Nếu tập lệnh của bạn là nội tuyến (không được liên kết), bạn cũng sẽ cần phải bọc phần thân tập lệnh trong một khai báo CDATA. Do đó, bản tóm tắt kịch bản lệnh nội tuyến cho SVG (và các biến thể XML khác)

<script type="text/ecmascript">
<![CDATA[
// your javascript code goes here
]]>
</script>

Đây có thể là những trường hợp đặc biệt 'trong tự nhiên', nhưng chúng là thực tế và việc sử dụng SVG đang phát triển, do đó, không ai khác cho rằng thuộc tính loại và CDATA hoàn toàn lỗi thời trong các trình duyệt hiện đại. Các trường hợp sử dụng là hẹp, có, nhưng không nghe thấy.

"Thay đổi môi trường để đối diện với nó và mọi phần của trí tuệ trở thành tồi tệ nhất của sự điên rồ." - Ashby


1
Cuộc gọi tốt Chỉ cần làm việc trên một số SVG phức tạp và đây thực sự là trường hợp!
Dave Everitt

1

Đặc tả HTML5 yêu cầu các tác giả bỏ qua thuộc tính thay vì cung cấp loại MIME dự phòng. MDN

Các MIME Sniffing tiêu chuẩn cho phép Javascript được phân phối bằng bất kỳ loại MIME ( Multipurpose Internet Mail Extensions ) phù hợp với những điều sau đây:

<script type="application/javascript"></script>
<script type="application/ecmascript"></script>

<script type="text/javascript"></script>
<script type="text/ecmascript"></script>

0

Vâng, tôi tiếp tục thấy nhiều ví dụ hơn mà không có văn bản / javascript nhưng vì một số lý do, các tập lệnh của tôi sẽ không hoạt động trong FF khi tôi làm như vậy. Tôi khuyên bạn nên giữ khai báo văn bản / javascript. Thẻ CDATA ngăn javascript hiển thị dưới dạng văn bản thuần trong trang web của bạn nếu trình duyệt của bạn đã tắt javascript. Cá nhân tôi không sử dụng các thẻ đó nữa, đừng nghĩ rằng có sự phân bổ của người dùng ngoài đó và nếu họ ở ngoài đó họ có thể muốn phát triển một số bộ não: P


Cả thuộc tính loại lẫn thứ CDATA cũ đều không cần thiết trừ khi bạn thực sự muốn nhắm mục tiêu các trình duyệt thực sự cổ. Họ không nên làm tổn thương bất cứ điều gì miễn là bạn thực sự sử dụng đúng loại.
Pointy

Tôi đang sử dụng bản phát hành FF ổn định gần đây nhất và dường như gặp khó khăn khi phân tích cú pháp mà không khai báo văn bản / javascript, tôi sử dụng jQuery btw nhưng điều đó sẽ không tạo ra sự khác biệt.
Michael

Vâng, tôi chạy toàn bộ ứng dụng web của mình với các thẻ script đơn giản <script>, không có "ngôn ngữ" và không có "loại" và chúng hoạt động tốt trong tất cả các trình duyệt. (Chà, tất cả những cái hợp lý: FF, Chrome, Safari, IE, Opera.)
Pointy

1
@pointy có vẻ như FatherStorm chỉ đăng một câu trả lời tại sao điều này xảy ra. vì vậy ý ​​kiến ​​của bạn dường như không chính xác.
Michael

@Michael có thể là trường hợp nếu bạn phạm sai lầm khi sử dụng XHTML / Strict, bạn có thể gặp sự cố, nhưng ngay cả khi đó tôi cũng nghi ngờ điều đó. Có một thỏa thuận chung giữa các ngôi sao của thế giới JavaScript rằng thuộc tính "loại" là không cần thiết và trên thực tế vì một "loại" xấu sẽ phá vỡ một tập lệnh, nó chỉ là một nguồn lỗi.
Pointy

0

type="text/javascript" : Bắt buộc trong HTML 4 và XHTML, nhưng tùy chọn trong HTML5.

CDATA : Bắt buộc trong XHTML.

<!--: Được sử dụng để ẩn JavaScript khỏi các trình duyệt rất cũ. Ví dụ: Netscape 1 và Internet Explorer 2, không ai sử dụng nữa.

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.