3 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
到目前為止,所有發(fā)布的答案都給出了正確的解決方案,但是沒有人能夠正確解釋具體問題的根本原因。
Facelets是基于XML的視圖技術(shù),它使用XHTML + XML生成HTML輸出。XML具有五個(gè)特殊字符,XML解析器對(duì)其進(jìn)行了特殊處理:
< 標(biāo)簽的開始。
> 標(biāo)簽的結(jié)尾。
" 屬性值的開始和結(jié)束。
' 屬性值的替代開始和結(jié)束。
&實(shí)體的開頭(以結(jié)尾;)。
在箱子&,其后面沒有#(例如 , 等),XML解析器被隱含找五個(gè)一預(yù)定義的實(shí)體名稱 lt,gt,amp,quot和apos,或任何手動(dòng)定義實(shí)體名稱。但是,在您的特定情況下,您使用的&是JavaScript運(yùn)算符,而不是XML實(shí)體。這完全解釋了您遇到的XML解析錯(cuò)誤:
實(shí)體名稱必須緊隨實(shí)體引用中的“&”
本質(zhì)上,您在錯(cuò)誤的位置編寫了JavaScript代碼,而不是JS文件而不是JS文件,因此您應(yīng)該相應(yīng)地轉(zhuǎn)義所有XML特殊字符。在&必須進(jìn)行轉(zhuǎn)義為&。
因此,在您的特定情況下,
if (Modernizr.canvas && Modernizr.localstorage &&
必須成為
if (Modernizr.canvas && Modernizr.localstorage &&
使它對(duì)XML有效。
但是,這使JavaScript代碼更難以閱讀和維護(hù)。如Mozilla開發(fā)人員網(wǎng)絡(luò)出色的文檔“為XHTML編寫JavaScript”所述,您應(yīng)該將JavaScript代碼放在字符數(shù)據(jù)(CDATA)塊中。因此,按照J(rèn)SF的說法,它將是:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
XML解析器會(huì)將塊的內(nèi)容解釋為“普通香草”字符數(shù)據(jù),而不是XML,因此將XML特殊字符“按原樣”解釋。
但是,更好的方法是將JS代碼放在自己的JS文件中,該文件應(yīng)由<script src>或以JSF的形式包含在其中<h:outputScript>。
<h:outputScript name="onload.js" target="body" />
(請(qǐng)注意target="body";這種方法;無論它本身位于什么位置,JSF都將<script>在末尾自動(dòng)呈現(xiàn),從而達(dá)到與和相同的效果;因此,您不再需要在該腳本中使用它們了)<body><h:outputScript>window.onload$(document).ready()
這樣,您無需擔(dān)心JS代碼中的XML特殊字符。作為額外的好處,這使您有機(jī)會(huì)讓瀏覽器緩存JS文件,從而減小總響應(yīng)大小。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
解析器期望一些HTML內(nèi)容,因此它將&視為實(shí)體的開始,例如è。
使用以下解決方法:
<script type="text/javascript">
// <![CDATA[
Javascript code here
// ]]>
</script>
因此,您指定代碼不是HTML文本,而只是按原樣使用的數(shù)據(jù)。
添加回答
舉報(bào)