Các thẻ CDATA có cần thiết trong thẻ script không và nếu có thì khi nào?
Nói cách khác, đây là khi nào và ở đâu:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
thích hơn thế này:
<script type="text/javascript">
...code...
</script>
Phần CDATA là bắt buộc nếu bạn cần tài liệu của mình phân tích thành XML (ví dụ: khi trang XHTML được hiểu là XML) và bạn muốn có thể viết bằng chữ i<10
và a && b
thay vì i<10
a && b
, vì XHTML sẽ phân tích mã JavaScript dưới dạng dữ liệu ký tự được phân tích cú pháp trái ngược với dữ liệu ký tự theo mặc định. Đây không phải là vấn đề với các tập lệnh được lưu trữ trong các tệp nguồn bên ngoài, nhưng đối với bất kỳ JavaScript nội tuyến nào trong XHTML, bạn sẽ có thể muốn sử dụng phần CDATA.
Lưu ý rằng nhiều trang XHTML không bao giờ có ý định được phân tích cú pháp dưới dạng XML trong trường hợp này sẽ không phải là vấn đề.
Để có một bài viết hay về chủ đề này, hãy xem https://web.archive.org/web/20140304083226/http://javascript.about.com/l Library/blxhtml.htmlm
Khi trình duyệt coi đánh dấu là XML:
<script>
<![CDATA[
...code...
]]>
</script>
Khi trình duyệt coi đánh dấu là HTML:
<script>
...code...
</script>
Khi các trình duyệt coi đánh dấu là HTML và bạn muốn đánh dấu XHTML 1.0 của mình (ví dụ) để xác thực.
<script>
//<![CDATA[
...code...
//]]>
</script>
Trình phân tích cú pháp HTML sẽ coi mọi thứ giữa <script>
và </script>
là một phần của tập lệnh. Một số triển khai thậm chí không cần thẻ đóng chính xác; họ dừng giải thích tập lệnh tại ".</
", điều này đúng theo thông số kỹ thuật
Cập nhật Trong HTML5 và với các trình duyệt hiện tại, đó không còn là vấn đề nữa.
Vì vậy, trong HTML, điều này là không có thể:
<script>
var x = '</script>';
alert(x)
</script>
Phần CDATA
có hoàn toàn không có tác dụng . Đó là lý do tại sao bạn cần viết
var x = '<' + '/script>'; // or
var x = '<\/script>';
hoặc tương tự.
Điều này cũng áp dụng cho các tệp XHTML được phân phát dưới dạng text/html
. (Vì IE không hỗ trợ các loại nội dung XML, nên điều này gần như đúng.)
Trong XML, các quy tắc khác nhau được áp dụng. Lưu ý rằng các trình duyệt (không phải IE) chỉ sử dụng trình phân tích cú pháp XML nếu tài liệu XHMTL được cung cấp cùng với loại nội dung XML.
Đối với trình phân tích cú pháp XML, thẻ script
không tốt hơn bất kỳ thẻ nào khác. Đặc biệt, một nút tập lệnh có thể chứa các nút con không phải là văn bản, được kích hoạt bởi "<
"; và dấu "&
" biểu thị một thực thể ký tự.
Vì vậy, trong XHTML, điều này là chứ không phải :
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
Để giải quyết vấn đề này, bạn có thể gói toàn bộ tập lệnh trong phần CDATA
. Điều này nói với trình phân tích cú pháp: 'Trong phần này, không coi "<
" và "&
" làm ký tự điều khiển .' Để ngăn công cụ JavaScript diễn giải các dấu "<![CDATA[
" và "]]>
", bạn có thể gói chúng trong các nhận xét.
Nếu tập lệnh của bạn không chứa bất kỳ "<
" hoặc "&
", dù sao bạn cũng không cần phần CDATA
.
Về cơ bản, nó là cho phép viết một tài liệu có cả XHTML và HTML. Vấn đề là trong XHTML, trình phân tích cú pháp XML sẽ diễn giải các ký tự &, <,> trong thẻ script và gây ra lỗi phân tích cú pháp XML. Vì vậy, bạn có thể viết JavaScript của mình với các thực thể, ví dụ:
if (a > b) alert('hello world');
Nhưng điều này là không thực tế. Vấn đề lớn hơn là nếu bạn đọc trang bằng HTML, thẻ script được coi là CDATA 'theo mặc định' và JavaScript như vậy sẽ không chạy. Do đó, nếu bạn muốn cùng một trang đều ổn khi sử dụng trình phân tích cú pháp XHTML và HTML, bạn cần phải gắn thẻ script trong phần tử CDATA trong XHTML, nhưng KHÔNG gửi nó trong HTML.
Thủ thuật này đánh dấu sự khởi đầu của một yếu tố CDATA như một nhận xét JavaScript; trong HTML, trình phân tích cú pháp JavaScript bỏ qua thẻ CDATA (đây là một nhận xét). Trong XHTML, trình phân tích cú pháp XML (được chạy trước JavaScript) phát hiện ra nó và xử lý phần còn lại cho đến khi kết thúc CDATA dưới dạng CDATA.
Đó là một thứ X (HT) ML. Khi bạn sử dụng các ký hiệu như <
và >
trong JavaScript, ví dụ: để so sánh hai số nguyên, điều này sẽ phải được phân tích cú pháp như XML, do đó chúng sẽ đánh dấu là điểm bắt đầu hoặc kết thúc của thẻ.
CDATA có nghĩa là các dòng sau (mọi thứ cho đến ]]>
không phải là XML và do đó không nên được phân tích cú pháp theo cách đó.
Do không sử dụng CDATA trong HTML4 nhưng bạn nên sử dụng CDATA trong XHTML và phải sử dụng CDATA trong XML nếu bạn có các ký hiệu không được giải mã như <và>.
Để đảm bảo xác thực XHTML hoạt động chính xác khi bạn có JavaScript được nhúng trong trang của mình, thay vì được tham chiếu bên ngoài.
XHTML yêu cầu trang của bạn tuân thủ nghiêm ngặt các yêu cầu đánh dấu XML. Vì JavaScript có thể chứa các ký tự có ý nghĩa đặc biệt, bạn phải bọc nó trong CDATA để đảm bảo rằng xác thực không gắn cờ là không đúng định dạng.
Với các trang HTML trên web, bạn chỉ có thể bao gồm JavaScript được yêu cầu giữa và các thẻ. Khi bạn xác thực HTML trên trang web của mình, nội dung JavaScript được coi là CDATA (dữ liệu ký tự) do đó bị người xác nhận bỏ qua. Điều này cũng không đúng nếu bạn tuân theo các tiêu chuẩn XHTML gần đây hơn trong việc thiết lập trang web của mình. Với XHTML, mã giữa các thẻ script được coi là PCDATA (dữ liệu ký tự được phân tích cú pháp) do đó được trình xác nhận xử lý.
Vì điều này, bạn không thể chỉ bao gồm JavaScript giữa các thẻ script trên trang của mình mà không 'phá vỡ' trang web của bạn (ít nhất là về trình xác nhận có liên quan).
Bạn có thể tìm hiểu thêm về CDATA tại đây và thêm về XHTML tại đây .
CDATA chỉ ra rằng nội dung bên trong không phải là XML.
Đây là một lời giải thích về wikipedia
Khi bạn tuân thủ nghiêm ngặt XHTML, bạn cần CDATA để ít hơn và ký hiệu không được gắn cờ là các ký tự không hợp lệ.
để tránh lỗi xml trong quá trình xác nhận xhtml.
CDATA yêu cầu trình duyệt hiển thị văn bản như hiện tại và không hiển thị dưới dạng HTML.
CDATA chỉ ra rằng nội dung bên trong không phải là XML.
CDATA là cần thiết trong bất kỳ phương ngữ XML nào, bởi vì văn bản trong một nút XML được coi là một phần tử con trước khi được đánh giá là JavaScript. Đây cũng là lý do tại sao JSLint phàn nàn về ký tự <
trong regexes.
Tài liệu tham khảo
Khi bạn muốn nó xác thực (bằng XML/XHTML - cảm ơn, Loren Segal ).
Bằng cách đó, trình duyệt cũ hơn không phân tích mã Javascript và trang không bị hỏng.
Khả năng tương thích ngược. Phải yêu nó.