簡體   English   中英

我應該使用“]]>”或“//]]>”將CDATA部分關閉到xHTML中

[英]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//]]>
  • ETAGO和close-tag script
  • - >結果內容發送到JavaScript引擎: //<![CDATA[\\nalert('a&b');\\n//]]>

但是通過XML解析器:

  • 開放標記script (沒有特殊的解析含義)
  • 文字內容//
  • 打開CDATA部分,建立CDATA內容,直到下一個]]>序列
  • 文字\\n alert('a&b');\\n//
  • 關閉CDATA部分
  • 關閉標記script
  • - >結果內容發送到JavaScript引擎: //\\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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM