[英]Should I use “]]>” or “//]]>” for closing a CDATA section into xHTML
我想在不轉義特殊字符的情況下將腳本或CSS內聯到XHTML中。
我可以使用CDATA標記的部分來做到這一點。
根據http://www.w3.org/TR/xhtml1/#h-4.8,CDATA部分可以定義為:
<script type="text/javascript">
<![CDATA[
... unescaped script content ...
]]>
</script>
然后,根據http://www.w3schools.com/TAGS/tag_script.asp,CDATA可以看起來像:
<script type="text/javascript"><![CDATA[
// some code
//]]></script>
關閉CDATA部分的哪種方法更好? ]]>
或//]]>
?
根據www.w3.org/TR/xhtml1/#h-4.8,CDATA部分可以定義為:[no //]
是啊。 在XHTML中,他們可以。 正確的XHTML,由XML解析器讀取,例如當您將application/xhtml+xml
給非IE的Web瀏覽器時。
但是,您實際上可能正在使用text/html
,這意味着您的瀏覽器不是該部分中引用的“XML處理器”。 它是遺留的HTML4解析器,因此您必須遵守附錄C准則並避免使用HTML4中不起作用的任何XML功能。
特別是, <script>
或<style>
塊中的字符串<![CDATA[
和]]>
對於HTML4解析器並不特殊,因為在HTML4中,這兩個元素是'CDATA元素',其中標記不適用(除了</
ETAGO序列結束元素本身)。 因此,HTML4解析器會將這些字符串直接發送到CSS或JavaScript引擎。
因為<![CDATA[
無效的JS],您將收到JavaScript語法錯誤。 (其他答案在這里是錯誤的:它不僅僅是非常舊的瀏覽器 ,而是所有HTML4瀏覽器,它們會在腳本中為未注釋的CDATA部分提供錯誤。)
您使用//
或/*
注釋標記來隱藏JavaScript或CSS引擎中的內容。 所以:
<script type="text/javascript">//<![CDATA[
alert('a&b');
//]]></script>
(注意前導//
;在W3Schools示例代碼中省略了這一點,並使該示例代碼完全不起作用。失敗。不要相信W3Schools:它們與W3C無關,它們的材料通常是垃圾。)
這由HTML解析器讀取為:
script
建立CDATA內容直到下一個ETAGO //<![CDATA[\\n alert('a&b');\\n//]]>
script
//<![CDATA[\\nalert('a&b');\\n//]]>
但是通過XML解析器:
script
(沒有特殊的解析含義) //
]]>
序列 \\n alert('a&b');\\n//
script
//\\nalert('a&b');\\n//
雖然解析過程完全不同,但JS引擎在每種情況下都會得到相同的有效代碼,因為//
s唯一的區別在於注釋。
請注意,這是一個與老派截然不同的案例:
<script type="text/javascript"><!--
alert('a&b');
//--></script>
這是為了隱藏腳本/樣式內容,以便它不會在不理解<script>
和<style>
標簽的瀏覽器中寫入頁面。 這不會產生JavaScript / CSS錯誤,因為hack被置於不同的級別:它是CSS和JavaScript語言本身的語法特征, <!--
被定義為什么都不做,允許這個hack工作。
那些瀏覽器是古老的歷史; 你今天絕對不應該使用這種技術 。 特別是在XHTML中,因為XML解析器會引起你的注意,將整個腳本塊轉換為XML注釋而不是可執行代碼。
我想在不轉義特殊字符的情況下將腳本或CSS內聯到xHTML中。
避免這樣做,你會更快樂。
你真的需要<style>
的<
和&
字符嗎? 不,幾乎從不。 你真的需要在<script>
它們嗎? 嗯...有時,是的,在這種情況下,評論的CDATA部分是可以接受的。
但說實話,XHTML兼容性指南C.4適用於HTML4,與XHTML1一樣:任何非平凡的東西都應該是外部腳本,然后您不必擔心這一點。
取決於瀏覽器。 盡管有些人認為,w3schools與W3C沒有關系,所以他們的建議是用一粒鹽。
現代瀏覽器應該能夠識別CDATA部分。 MSIE OTOH沒有,但是沒關系,因為它根本不支持XHTML(你不是為了MSIE兼容性而發送XHTML內容作為text / html,是嗎?那么使用XHTML沒什么意義首先)。
問題是,不完全理解XHTML的瀏覽器會將CDATA指令視為常規文本。
tl; dr:完全向后兼容的解決方案將是這樣的:
<script type="text/javascript"><!--//<![CDATA[
code goes here...
//]]>--></script>
那只是令人厭惡的。 如果你想要保持向后兼容性或堅持使用HTML,直到你能夠忽略MSIE 8(這需要人們多少年來回避MSIE 6,可能是在2020年左右),要么將JS放在JS文件中。
只有不了解腳本標記的瀏覽器才需要HTML注釋( <!-- -->
)。 對於不了解CDATA部分的瀏覽器(即非MSHT的非XHTML瀏覽器),需要使用雙斜杠。 XHTML需要CDATA部分以避免格式錯誤的XML(例如,大於和小於比較,否則將破壞XML或需要轉義,這也是瀏覽器問題)。
有關將XHTML作為text / html發送的問題的更多信息,請閱讀: http : //hixie.ch/advocacy/xhtml
編輯:為了糾正自己,根據Hixie的說法,向后支持的完整語法實際上是這樣的:
<script type="text/javascript"><!--//--><![CDATA[//><!--
...
//--><!]]></script>
謝謝,Alohci。
我會在沒有//的情況下這樣做。 這些都是某些瀏覽器(誰將保持無名)必須被“愚弄”接受腳本標簽中的右括號的日子。
如果您擔心有人使用的是一個根本不了解XHTML的舊瀏覽器,您可以在CDATA標簽之前添加注釋。 但是,您還必須在開始標記之前添加注釋,以防止它導致語法錯誤:
<script type="text/javascript">
//<![CDATA[
// some code
//]]>
</script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.