Các nhận xét HTML lồng nhau có khả thi không?


96

theo tiêu đề; có thể có các nhận xét lồng nhau trong HTML hợp lệ không? xem ví dụ bên dưới ...

<p>some text</p>

  <!-- comment 1

    <p>commented out html</p>

    <!-- comment 2

      // are nested html comment allowed?

    end of comment 2 -->

    <p>more commented out html</p>

  end of comment 1 -->

<p>some more text</p>

Có vẻ như không, có ai biết làm thế nào tôi có thể nhận được các nhận xét lồng nhau để hoạt động không?


4
... hoặc tôi không nghĩ là có thể nhưng có thể ai đó có kinh nghiệm hơn tôi sẽ biết!
QAZ

Nếu nghi ngờ về những gì là hợp lệ trong HTML, tôi thường cắt giảm và đi đến các tiêu chuẩn. Cụ thể, Dịch vụ xác thực đánh dấu W3C tại validator.w3.org
Mawg cho biết hãy khôi phục Monica vào

Câu trả lời:


103

Khi bạn lồng một nhận xét, hãy thay thế "-" bằng "- -". Khi bạn bỏ lồng, hãy đảo ngược quy trình. Đó không phải là <!--điều bị cấm mà là --.

Thí dụ:

<!-- some stuff
<!- - some inner stuff - ->
<!- - a sibling - ->
the footer -->

4
Điều này có nghĩa là nhận xét bên trong không còn là một nhận xét thích hợp?
S.Lott

10
Có, HTML và XML không cho phép lồng các nhận xét bằng cách sử dụng <! -. Những gì bạn có thể làm trong mã của riêng mình là xác định một phần tử nhận xét và chủ động bỏ qua nó trong quá trình phân tích cú pháp.
Aaron Digulla

1
lưu ý rằng bạn nên thay thế --bằng - - cho chú thích bên trong (lồng nhau) .
ebosi

3
Nếu bạn thay đổi "-" thành "- -" thì nó không còn là bình luận nữa. Nó không phải là một giải pháp nhưng một con đường xung quanh, bạn cũng có thể sử dụng "<% - nhận xét của bạn -%> cho một con đường xung quanh.
Anant Singh

Làm thế nào điều này được ủng hộ và được chấp nhận là câu trả lời tốt nhất? Nó thậm chí không hoạt động! Geesh. Hãy đọc phần giải thích của Dave Land dưới đây.
John E

97

TL; DR : Thật không may, không, không thể (và sẽ không bao giờ).

Câu trả lời ngắn:

Một nhận xét HTML không hoàn toàn như nhiều người nghĩ. HTML là một dạng của SGML, trong đó các nhận xét được phân tách bằng các cặp dấu gạch ngang ( --…  --).

Do đó, bất kỳ cặp dấu gạch ngang kép nào bên trong cặp dấu ngoặc nhọn có dấu chấm than sau dấu ngoặc mở ( <! ---- >) đều là nhận xét. Thông số kỹ thuật nói rằng nó tốt hơn tôi có thể: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4

Đây là lý do tại sao ý kiến như thế này (mà chúng tôi đã tất cả các khả năng thực hiện một lần này hay cách khác) là một xấu ý tưởng:

<! - ------------------ NGƯỜI DÙNG BẮT ĐẦU Ở ĐÂY -------------------->

Sự thật: Tôi quá lười để cho bạn biết có bao nhiêu nhận xét được đại diện bởi ô nhiễm thẻ ở trên, nhưng ít nhất là 10.

Tôi bớt lười biếng hơn: Cái gọi là "bình luận" này thực sự bao gồm 10 bình luận, ba từ bên ngoài bình luận bất kỳ (tức là chỉ là SGML xấu) và phần đầu của một bình luận không bị chấm dứt. Đó là một mớ hỗn độn thực sự:

<!--1 ----2 ----3 ----4 ----5--
HEADER BẮT ĐẦU TẠI ĐÂY
--6 ----7 ----8 ----9 ----10-- -->

Tất nhiên, nó không hoàn toàn đơn giản, do sự khác biệt trong cách mỗi trình duyệt chọn để diễn giải thông số kỹ thuật.

Đây là một bài báo xuất sắc giải thích điều đó:

    http://weblog.200ok.com.au/2008/01/dashing-into-trouble-why-html-comments.html

Câu trả lời dài: Tại sao chúng tôi hiểu sai

Hầu hết chúng ta, những người lớn lên với HTML (mà không tìm hiểu kỹ về SGML làm nền tảng cho nó)) đều tin rằng chuỗi <!--bắt đầu một nhận xét và chuỗi -->kết thúc một nhận xét.

Trên thực tế, <!>phân tách một khai báo SGML trong tài liệu HTML của bạn, chẳng hạn như khai báo DOCTYPE mà tất cả chúng ta đã thấy ở đầu các trang của mình. Trong một khai báo SGML, các nhận xét được phân tách bằng dấu gạch ngang. Do đó, nhận xét HTML

<! - đây là nhận xét ->

mà hầu hết chúng ta sẽ tin được phân tích như thế này <!-- this is a comment -->thực sự là phân tích cú pháp như thế này:
<!-- this is a comment -->. Đó là một khai báo SGML trống ngoại trừ một chú thích.

Vì HTML là một dạng của SGML nên "comment-trong-một khai báo" này có chức năng như một comment HTML.

Không quan tâm, đây là một đoạn SGML thuần túy hiển thị các nhận xét hoạt động như dự kiến ​​trong SGML: định nghĩa danh sách thuộc tính này chứa một nhận xét trên mỗi dòng:

<! LIÊN KẾT DANH SÁCH
  % attrs; -% coreattrs,% i18n,% event -
  bảng mã% Charset; #IMPLIED - mã hóa char của tài nguyên được liên kết -
  href% URI; #IMPLIED - URI cho tài nguyên được liên kết -
  hreflang% LanguageCode; #IMPLIED - mã ngôn ngữ -
  gõ% ContentType; #IMPLIED - loại nội dung tư vấn -
  rel% LinkTypes; #IMPLIED - các loại liên kết chuyển tiếp -
  rev% LinkTypes; #IMPLIED - các loại liên kết ngược -
  media% MediaDesc; #IMPLIED - để hiển thị trên các phương tiện này -
>

1
Hấp dẫn. Tôi tự hỏi nếu điều này vẫn đúng với phân tích cú pháp html5.
Kzqai

1
Thật không may, có, nó vẫn đúng, vì nó là một phần của nền tảng SGML cơ bản mà tất cả HTML, bao gồm cả HTML5, dựa trên đó. Đó là tất cả nhưng điều này không thể thay đổi.
Dave Land

8

Nó không thể được thực hiện. -->sẽ luôn kết thúc một bình luận HTML hiện có.


4
Các ngôn ngữ lập trình khác như LUA cho phép nó. == [[và == [1 [là phần bắt đầu của hai khối nhận xét riêng biệt. Tôi không hiểu tại sao một ngày nào đó HTML không thể làm được điều tương tự.
john ktejik

7

Nếu bạn thực sự bị mắc kẹt với một số đoạn HTML - được hiển thị trước tại một số nguồn không thể kiểm soát - chứa các nhận xét và bạn cần đảm bảo rằng không có đoạn nào trong số đó được hiển thị trên trang của mình, bạn luôn có thể bọc nó bằng một scriptthẻ như bên dưới, chỉ có điều là bạn không thể bình luận scriptcác thẻ theo cách này.

<p>some text</p>

<!-- multiline "comment" below using script type="text/html" -->
<script type="text/html">

  <p>commented out html</p>

  <!-- comment 2

      // are nested html comment allowed?

    end of comment 2 -->

  <p>more commented out html</p>

</script>

<p>some more text</p>

Nếu bạn cần nhận xét scriptcác thẻ, bạn có thể sử dụng textareadưới dạng trình bao bọc để thay thế, tất nhiên làm theo cách này, bạn không thể nhận xét textareacác thẻ.

<p>some text</p>

<!-- multiline "comment" below using textarea style="display:none;" -->
<textarea style="display:none;">

  <script>  

    alert("which won't show up..");  

  </script>

  <p>commented out html</p>

  <!-- comment 2

      // are nested html comment allowed?

    end of comment 2 -->

  <p>more commented out html</p>

</textarea>

<p>some more text</p>


1
Tài giỏi! Nhưng phải làm gì nếu mã HTML đã có chứa thẻ <script> ...
Willem

3
@Willem, cập nhật câu trả lời với một cách tiếp cận bổ sung mà có thể làm việc trong kịch bản của bạn ..
Mathijs Flietstra

1
Cảm ơn, đó là một cách mới. Có lẽ bạn cũng có thể gói gọn vấn đề này trong các khối bình luận JS:/* */
Willem

7

Sử dụng templatethẻ. Cách nhanh nhất để chặn tất cả bình luận và html khác hiển thị.

<template>
    <!-- first paragraph-->
    Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    <!-- second paragraph-->
    Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</template>

    <!-- third paragraph-->
    Ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.sunt in culpa qui officia deserunt mollit.

Không <template>thể chỉ thêm phần tử vào bất kỳ đâu. Phần tử mẹ của nó phải là <body>phần tử hoặc một vài phần tử được chọn khác .
John E

1

Một số trình chỉnh sửa có các lệnh nhận xét / bỏ ghi chú có thể tự động xử lý các nhận xét hiện có trong một khối văn bản. Ví dụ Visual Studio đang làm điều đó khi bạn nhấn Ctrl + KC và Ctrl + KU.


Tôi đang thử những gì bạn đã nói cho Ctrl + KC & Ctrl + KU cho các nhận xét html lồng nhau trong VS2013, nhưng rất tiếc là nó không xử lý được.
Mahdi Alkhatib

1

Một bổ trợ VS giả mạo các nhận xét lồng nhau bằng cách tự động chuyển đổi <!--...-->để <!~~...~~>sau đó nhận xét ra toàn bộ phần đó. Nó cho phép bạn bật và tắt.

bình luận lồng nhau


0

Tôi nghĩ rằng nó không được phép, nhưng theo như tôi biết thì nó hoạt động trên hầu hết các trình duyệt chính ngoại trừ Firefox.


0

thử sử dụng cái này

<!-- 

đây là phần bắt đầu của bình luận

<%-- this is another comment --%>

<%-- this is another one --%>

--> cuối các ý kiến.


0

Thử cái này

<p>some text</p>
<comment> comment 1
<p>commented out html</p>
<!-- comment 2
  // are nested html comment allowed?
end of comment 2 -->
<p>more commented out html</p>
end of comment 1 </comment>
<p>some more text</p>

1
Bạn có thể giải thích? Tôi không biết về một <comment>từ khóa trong HTML
Mawg nói hãy khôi phục Monica
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.