Nhận xét HTML bên trong thẻ script có phải là phương pháp hay nhất không? [đóng cửa]


97

Thực tiễn sau đây khá phổ biến trong JavaScript nội tuyến mà tôi phải làm việc:

<script type="text/javascript">
   <!--
       // Code goes here
   //-->
</script>

Tôi biết rằng mục đích là ngăn các trình duyệt không tương thích với JavaScript hiển thị nguồn, nhưng đây có phải là phương pháp hay nhất hiện nay không? Phần lớn các trình duyệt được sử dụng ngày nay có thể diễn giải JavaScript; ngay cả các thiết bị di động hiện đại thường không gặp sự cố.

Đối với 'tại sao không?' câu hỏi: Gần đây tôi đã phải dành vài giờ để gỡ lỗi một vấn đề trong đó ai đó đã bỏ dấu '//' trước dấu '->' ở cuối thẻ tập lệnh bị chôn sâu trong một số trang và điều này gây ra JavaScript bí ẩn các lỗi.

Bạn làm nghề gì? Đây vẫn được coi là một 'phương pháp hay nhất?'


Câu trả lời:


118

Điều quan trọng là ngày nay, việc một trình duyệt cụ thể có hỗ trợ JavaScript hay không là không liên quan (rõ ràng là tuyệt đại đa số đều làm như vậy) - điều đó không liên quan vì hầu hết tất cả đều hiểu các khối script, có nghĩa là họ biết bỏ qua JavaScript ngay cả khi họ không thể diễn giải nó.

Matt Kruse đưa ra lời giải thích chi tiết hơn một chút trên trang web Hộp công cụ JavaScript của anh ấy về lý do cụ thể là không sử dụng nhận xét HTML trong các khối tập lệnh.

Trích dẫn từ trang đó:


Không sử dụng nhận xét HTML trong khối tập lệnh

Trong những ngày xa xưa của javascript (1995), một số trình duyệt như Netscape 1.0 không có bất kỳ hỗ trợ hoặc kiến ​​thức nào về thẻ script. Vì vậy, khi javascript lần đầu tiên được phát hành, một kỹ thuật là cần thiết để ẩn mã khỏi các trình duyệt cũ hơn để chúng không hiển thị nó dưới dạng văn bản trong trang. 'Hack' là sử dụng các nhận xét HTML trong khối script để ẩn mã.

Sử dụng nhận xét HTML trong tập lệnh là không tốt

// DON'T do this! Code is just representative on how things were done
<script language="javascript">
<!--
   // code here
//-->
</script>

Không có trình duyệt nào được sử dụng phổ biến ngày nay không biết đến thẻ <script>, vì vậy việc ẩn mã nguồn javascript không còn cần thiết nữa. Trên thực tế, nó có thể được coi là có hại vì những lý do sau:

  • Trong tài liệu XHTML, nguồn thực sự sẽ bị ẩn khỏi tất cả các trình duyệt và vô dụng
  • - không được phép trong các nhận xét HTML, vì vậy bất kỳ hoạt động giảm nào trong tập lệnh đều không hợp lệ

1
+1. Tôi biết có người có nhiều thông tin về chủ đề này từ những ngày sử dụng comp.lang.javascript của tôi, tôi đang xem xét các kho lưu trữ của nhóm tin tức khi câu trả lời của bạn xuất hiện, trích dẫn Matt.
Grant Wagner

1
Trong XHTML, bạn có thể sử dụng một CDATA thay vì nhận xét HTML: <script ...> // </ script> <[CDATA [... //]]!>
bê tông Gannet

Tôi nên nói thêm rằng 'vụ hack' này tạo ra lỗi trong Internet Explorer 9 (Một khách hàng đã phàn nàn về một trang không hoạt động bình thường và đây là nguyên nhân)
lordscales91

24

Tôi đã ngừng làm việc đó. Tại một số thời điểm, bạn chỉ cần từ bỏ NCSA Mosaic của bạn.


7
Nói cách khác, không có lý do nào được đưa ra để giải thích tại sao OP nên ngừng làm việc đó. Bạn đang đề nghị anh ấy nên ngừng làm việc đó bởi vì bạn đã làm vậy, đó không phải là lý do đủ chính đáng để trở thành IMO câu trả lời.
Lawrence Aiello

1
@LawrenceAiello: Còn cụm từ "phương pháp hay nhất" khiến bạn nghĩ đến "sự kiện" chứ không phải "ý kiến" thì sao?
hỗn loạn

5
trong đó có lỗi cuối cùng trong toàn bộ bài đăng này. Đáng lẽ nó phải được đóng lại vì nó là một câu hỏi thảo luận.
Lawrence Aiello

1
Có lẽ khi điều này được đăng cách đây sáu năm, điều này đủ tiêu chuẩn như một câu trả lời, tuy nhiên theo tiêu chuẩn của trang web ngày nay thì không.
j08691

1
Câu trả lời này đã được thảo luận trên Meta SO
CubeJockey

10

Theo Khuyến nghị của W3C, việc ẩn dữ liệu tập lệnh khỏi CÁC ĐẠI LÝ NGƯỜI DÙNG là rất hữu ích.

Trích dẫn từ trang W3c :

Tập lệnh bình luận trong JavaScript Công cụ JavaScript cho phép chuỗi "<!--"xuất hiện ở đầu phần tử SCRIPT và bỏ qua các ký tự khác cho đến cuối dòng. JavaScript diễn giải "//" là bắt đầu một nhận xét kéo dài đến cuối dòng hiện tại. Điều này là cần thiết để ẩn chuỗi "->" khỏi trình phân tích cú pháp JavaScript.

    <SCRIPT type="text/javascript">
<!--  to hide script contents from old browsers
  function square(i) {
    document.write("The call passed ", i ," to the function.","<BR>")
    return i * i
  }
  document.write("The function returned ",square(5),".")
// end hiding contents from old browsers  -->
</SCRIPT>

2
Nếu HTML 4.x đang được sử dụng. Đó là một câu chuyện hoàn toàn khác với XHTML.
Quentin

8

Không, đó là một sự nôn nao từ một giải pháp được sử dụng khi phần tử script được giới thiệu lần đầu tiên. Không có trình duyệt nào không hiểu phần tử tập lệnh ngày nay (ngay cả khi nó hiểu nó là "Tập lệnh nên bị bỏ qua vì tập lệnh bị tắt hoặc không được hỗ trợ").

Trong XHTML, chúng có hại tích cực.

Tôi đã viết một cái gì đó về lịch sử của nó một thời gian trở lại.


3

Đã dừng sử dụng cái này một thời gian trở lại. Ngoài ra, theo Douglas Crockford , bạn có thể bỏ thuộc tính type khỏi các thẻ script của mình vì ngôn ngữ script duy nhất có sẵn trong hầu hết các trình duyệt là JavaScript.


1
Hầu hết các trình duyệt sẽ vẫn hoạt động, tuy nhiên, nó vi phạm đặc điểm kỹ thuật HTML, vì vậy tôi sẽ không khuyên bạn.
Quentin

4
bạn không bao giờ biết khi nào IE sẽ lấy tập lệnh VB làm kiểu mặc định ..
Francis

1

Nếu bạn đang nhập thủ công, tôi khuyên bạn nên luôn sử dụng các tệp js bên ngoài, điều đó sẽ giúp ích rất nhiều.

Về mối quan tâm của bạn: ngày nay hầu hết các trình duyệt đều an toàn với JavaScript. Tuy nhiên, đôi khi mọi người có thể viết các trình phân tích cú pháp đơn giản để tìm nạp HTML trực tiếp - và tôi phải nói rằng, trích dẫn an toàn thực sự hữu ích cho những khách hàng đó. Ngoài ra, một số ứng dụng khách không phải JS như Lynx cũ sẽ nhận được lợi ích từ điều này.


1

Nếu bạn không bao gồm văn bản theo nghĩa đen giữa các thẻ tập lệnh - nghĩa là nếu bạn tải tập lệnh từ tệp src, bạn có thể quên các nhận xét.



0

Tôi đã ngừng làm điều đó từ lâu rồi. Bạn thực sự không cần nó trong thời đại ngày nay.


@Yvette Động lực của bạn để đăng bình luận đó sáu năm sau khi tôi đăng câu trả lời của mình là gì?
John Topley

@Yvette Không có gì xúc phạm, tôi chỉ đơn thuần là tò mò. Và tất nhiên bạn đúng; ngày nay tôi đã đăng nó như một bình luận.
John Topley

-1

Tôi không làm điều đó nhưng ngày hôm trước, tôi đã xác thực trang web được bảo vệ bằng mật khẩu của mình tại w3c. Vì vậy, tôi đã phải sử dụng phương pháp nhập liệu trực tiếp của họ. Nó phàn nàn về javascript của tôi, vì vậy tôi đưa các nhận xét trở lại trong mọi thứ đều ổn.

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.