2012-03-06 67 views
4

運行JavaScript我試圖運行在每個瀏覽器下面的HTML:歌劇,FF,IE,Chrome的不能在CDATA

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"> 
</head> 
<body> 
    <script> 
    <![CDATA[ 
    alert('Hey!'); 
    ]]> 
    </script> 
</body> 
</html> 

他們沒有顯示警報。 Chrome在控制檯中記錄錯誤:未捕獲的SyntaxError:意外的令牌<。它似乎在抱怨CDATA聲明中的拳頭<。火狐還記錄「語法錯誤」

W3Schools的指出,這是使用CDATA http://www.w3schools.com/xml/xml_cdata.asp的方式。 Other answers在這個網站上建議。我究竟做錯了什麼?我嘗試使用命名空間和文檔類型,但這並沒有改變任何東西。

編輯:我添加XHTML名字空間和文檔類型,那我當初刪除,問題仍然存在。

+1

XML!= HTML。下面是一個解釋它的問題: – 2012-03-06 19:26:06

+1

可能的重複[When is a CDATA section within a script tag?](http://stackoverflow.com/questions/66837/when-is-a-cdata-section-necessary-腳本內標籤) – 2012-03-06 19:27:53

+1

XHTML是XML。事實上,我服務器上的所有HTML都是由XSL模板生成的,因此根據定義它是有效的XML。 – 2012-03-06 19:28:54

回答

5

的相關問題When is a CDATA section necessary within a script tag?解釋說,嵌入在XHTML文檔中的腳本時,建議CDATA節。但是,僅僅爲測試文檔設置XHTML文檔是不夠的。 CDATA仍被視爲語法錯誤。

this blog post,這是因爲它的內容類型需要的文檔類型定義相匹配。正確的XHTML需要具備以下Content-type頭設置:如果未指定,text/html發送相反,瀏覽器將恢復到HTML

Content-type: application/xhtml+xml 

。事實上,如果我將這個頭文件添加到我的測試用例中,即使CDATA沒有被註釋掉,瀏覽器也可以正確地解析CDATA中的JavaScript。

這對我的作品(設置使用PHP頭):

<?php header("Content-type: application/xhtml+xml"); 
     echo '<?xml version="1.0" encoding="UTF-8"?>'; ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
    <script><![CDATA[alert('Hey!');]]></script> 
    </head> 
    <body> 
    </body> 
</html>​ 
+0

感謝這是唯一正確的解決方案。有趣的是,即使維基百科在他們的例子中也有這樣的語法錯誤http://en.wikipedia.org/wiki/XHTML – 2012-03-06 20:57:08

+0

@Mike,我很想知道我的答案中有什麼不正確。 – danorton 2012-03-06 21:02:21

1

此外,您還需要註釋掉CDATA,所以它不會拋出一個分析錯誤時,它的運行:

<script> 
//<![CDATA[ 
    alert('Hey!'); 
//]]> 
</script> 
+0

如果他使XHTML正確,則不是。 – 2012-03-06 19:59:48

+0

我的輸出是由XSL變壓器產生的。 CDATA部分是由變壓器添加的,你建議是不可能的。 – 2012-03-06 20:51:23

2

您可能會看到它作爲XML(XHTML),但是這就是瀏覽器不如何看待它。

你爲它服務一個text/html這意味着瀏覽器將其視爲HTML。

它需要與作爲application/xhtml+xml

即這樣

http://www.alohci.net/application/xhtml+xml/starov.htm.ashx

而不是XML MIME類型,例如提供服務喜歡這個

http://www.alohci.net/text/html/starov.htm.ashx

檢查視圖源看到它是同一個文件。檢查Firebug中的「Net」標籤(或瀏覽器的等效標籤)以查看響應頭中的內容類型。

+0

謝謝。有趣的是,元標籤相當於是不夠的。基本上,如果這是一個磁盤上的文件而不是服務器上的文件,它從來沒有被正確解析的機會。 – 2012-03-06 21:04:52

+0

請注意,如果文件是在本地訪問的(即通過'file:'協議),則適用不同的規則,瀏覽器從文件擴展名開始。所以具有.xhtml擴展名的文件將被解析爲XML。 – Alohci 2012-03-07 00:51:00

0

1)評論你的CDATA

//<![CDATA[ 
    alert('Hey!'); 
    //]]> 

2)添加腳本類型

<script type="text/javascript"> 
6

不同的是HTML和XHTML之間。 W3Schools是正確的,它是XHTML中有效的CDATA構造,但是因爲您的問題表明您的代碼是HTML,並且在HTML中沒有像CDATA <script>這樣的內容,所以您的示例只要解釋器​​看到「<」就會失敗。您可以告訴瀏覽器它正在查看XHTML,但它也可能更安全地處理HTML。爲此,您需要在JavaScript註釋中隱藏CDATA。 (你也可以考慮確定哪些語言是您<script>塊內。)

<html> 
<head> 
</head> 
<body> 
    <script> 
    //<![CDATA[ 
    alert('Hey!'); 
    //]]> 
    </script> 
</body> 
</html> 

這一點,事實上,由萬維網聯盟(W3C)在XHTML Media Types, A.4. Embedded Style Sheets and Scripts推薦的方法。

+0

如果他使XHTML正確,那麼CDATA標籤將不會將其放入註釋中。 (並不是說現在不需要使用XHTML。) – 2012-03-06 20:03:22

+0

謝謝,我已經詳細闡述了這一點。 – danorton 2012-03-06 20:07:47

+0

我刪除了所有這些以使我的示例更簡單。將其添加回來並不能解決問題。我編輯了我的問題並添加了它們。 – 2012-03-06 21:02:12