2013-05-05 62 views
3

我讀這個question,我有一個相關的問題:爲什麼CDATA在腳本標記下被註釋掉了?

這傢伙here說:

它在腳本標籤是用來避免解析<和&。在HTML中,這是不需要的 ,因爲在HTML中,腳本已經是 #CDATA。

問題#1

如果腳本已經 #CDATA:爲什麼它renderd(下腳本標籤)仍CDATA?

<script type="text/javascript"> 
// <![CDATA[ 

// ]]> 
</script> 

問題2

爲什麼它作爲一個評論? (//

+0

它被註釋掉,否則你會得到一個JS語法錯誤。我目前沒有看到CDATA在HTML腳本標記中被大量使用,並且不會自己使用它。也許是從XHTML的日子開始的,因爲CDATA是一個XML構造,而XHTML使用了許多XML的規則。 – Netricity 2013-05-05 08:15:26

回答

8

XHTML應該通過使用媒體類型application/xhtml+xml作爲XML提供。在HTML5中,標記僅爲 XHTML(如果使用XML媒體類型)。當像這樣服務時,腳本元素的內容是而不是 CDATA。

因此,要讓XML解析器將腳本內容視爲CDATA,它們可以包裝在<![CDATA[ ]]>中。

儘管很少有人歷史上將標記作爲application/xhtml+xml,但許多人已經將他們的頁面驗證爲XHTML。 XHTML驗證器同樣期望腳本內容通常不是CDATA,因此通常會拒絕嵌入在JavaScript中的標記和其他標記碎片,除非它們被轉義,除非它們被轉義<![CDATA[ ]]>

驗證其頁面爲XHTML後,它們會然後以text/html媒體類型向瀏覽器提供其頁面,這意味着瀏覽器將標記視爲HTML而不是XHTML。在這種情況下,使用HTML解析器,其中確實將腳本內容自動視爲CDATA,因此<![CDATA[]]>。成爲由JavaScript引擎運行的腳本的一部分。因此,要從JavaScript引擎中隱藏這些字符串,它們在同一行上以//開頭,這意味着JavaScript引擎認爲這些行是註釋。

最後,有些人服務於application/xhtml+xmltext/html的相同標記,根據HTTP請求消息中的信息進行切換。出於與上述相同的原因,要在兩種模式下正確處理腳本內容,//<![CDATA[//]]>模式是非常有效的技術。

+3

我認爲這裏的關鍵點在於,XML註釋以「<! - 」開頭並以「 - >」結尾,而JavaScript註釋以「/ *」開頭並以「* /」結尾或以「//開頭」開頭「並以回車或換行結束。所以實際上這些行在JavaScript中註釋掉,但不在XML中註釋。因此,XML引擎仍然可以識別「<![CDATA [」和「]]>」,並讓它們像平常一樣工作,轉義可能出現在JS中的保留字符(正如Alohci解釋的那樣)。這是那些奇妙的冷靜寶石之一:D – CommaToast 2014-07-03 21:27:59