实体名称必须紧随实体参考中的“&”
我想在我的* .xhtml页面上放一个packman游戏。(我正在使用jsf 2和primefaces 3.5)
然而,
当我“翻译” xhtml中的html页面时,此脚本出现错误:
<script> var el = document.getElementById("pacman");
if (Modernizr.canvas && Modernizr.localstorage &&
Modernizr.audio && (Modernizr.audio.ogg || Modernizr.audio.mp3)) {
window.setTimeout(function () { PACMAN.init(el, "./"); }, 0);
} else {
el.innerHTML = "Sorry, needs a decent browser<br /><small>" +
"(firefox 3.6+, Chrome 4+, Opera 10+ and Safari 4+)</small>";
}
</script>
在行:
if (Modernizr.canvas && Modernizr.localstorage &&
我得到:
实体名称必须紧随实体引用中的“&”之后。
任何想法如何解决?
回答:
到目前为止,所有发布的答案都给出了正确的解决方案,但是没有人能够正确解释具体问题的根本原因。
Facelets是基于XML的视图技术,它使用XHTML+XML生成HTML输出。XML具有五个特殊字符,XML解析器对其进行了特殊处理:
<
标签的开始。>
标签的结尾。"
属性值的开始和结束。'
属性值的替代开始和结束。&
实体的开头(以结尾;
)。
在箱子&
,其后面没有#
(例如 
, 
等),XML解析器被隐含找五个一预定义的实体名称
lt
,gt
,amp
,quot
和apos
,或任何手动定义实体名称。但是,在您的特定情况下,您使用的&
是JavaScript运算符,而不是XML实体。这完全解释了您遇到的XML解析错误:
实体名称必须紧随实体参考中的“&”
本质上,您在错误的位置编写了JavaScript代码,而不是JS文件而不是JS文件,因此您应该相应地转义所有XML特殊字符。在&
必须进行转义为&
。
因此,在您的特定情况下,
if (Modernizr.canvas && Modernizr.localstorage &&
必须成为
if (Modernizr.canvas && Modernizr.localstorage &&
使它对XML有效。
但是,这使JavaScript代码更难以阅读和维护。如Mozilla开发人员网络出色的文档“为XHTML编写JavaScript”所述,您应该将JavaScript代码放在字符数据(CDATA)块中。因此,按照JSF的说法,它将是:
<h:outputScript> <![CDATA[
// ...
]]>
</h:outputScript>
XML解析器将把块的内容解释为“普通香草”字符数据而不是XML,因此将XML特殊字符“按原样”解释。
但是,更好的方法是将JS代码放在自己的JS文件中,该文件应由<scriptsrc>
或以JSF的形式包含在其中<h:outputScript>
。
<h:outputScript name="onload.js" target="body" />
(请注意target="body"
;这种方法;无论它本身位于什么位置,JSF都会<script>
在的最后自动呈现,从而获得与和相同的效果;因此,您不再需要在该脚本中使用它们了)<body>``<h:outputScript>``window.onload``$(document).ready()
这样,您无需担心JS代码中的XML特殊字符。作为额外的好处,这使您有机会让浏览器缓存JS文件,从而减小总响应大小。
以上是 实体名称必须紧随实体参考中的“&” 的全部内容, 来源链接: utcz.com/qa/404663.html