我想在我的 *.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 &&
我得到:
The entity name must immediately follow the '&' in the entity reference.
知道如何解决这个问题吗?
最佳答案
到目前为止发布的所有答案都给出了正确的解决方案,但是没有一个答案能够正确解释具体问题的根本原因。
Facelets 是一种基于 XML 的 View 技术,它使用 XHTML+XML 生成 HTML 输出。 XML 有五个特殊字符,XML 解析器对其进行特殊处理:
-
<
标记的开始。 -
>
标签结束。 -
"
属性值的开始和结束。 -
'
属性值的替代开始和结束。 -
&
实体的开始(以;
结束)。
In case of &
which is not followed by #
(e.g.  
,  
, etc), the XML parser is implicitly looking for one of the five predefined entity names lt
, gt
, amp
, quot
and apos
, or any manually defined entity name .但是,在您的特定情况下,您将 &
用作 JavaScript 运算符,而不是 XML 实体。这完全解释了您遇到的 XML 解析错误:
The entity name must immediately follow the '&' in the entity reference
本质上,您在错误的地方编写了 JavaScript 代码,一个 XML 文档而不是一个 JS 文件,因此您应该相应地转义所有 XML 特殊字符。 &
必须转义为 &
。
因此,在您的特定情况下,
if (Modernizr.canvas && Modernizr.localstorage &&
必须成为
if (Modernizr.canvas && Modernizr.localstorage &&
使它对 XML 有效。
但是,这会使 JavaScript 代码更难阅读和维护。如果您想在 XML 文档的 JavaScript 代码中继续使用 &
而不是 &
,那么您应该将 JavaScript 代码放在字符数据 (CDATA) block 中。因此,在 JSF 术语中,这将是:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
XML 解析器会将 block 的内容解释为“普通”字符数据而不是 XML,因此“按原样”解释 XML 特殊字符。
但是,更好的方法是将 JS 代码放在它自己的 JS 文件中,该文件由 <script src>
包含,或者用 JSF 术语来说,就是 <h:outputScript>
。
<h:outputScript name="onload.js" target="body" />
(注意 target="body"
;这样 JSF 会自动在 <script>
的末尾呈现 <body>
,而不管 <h:outputScript>
本身位于何处,从而实现与 window.onload
和 $(document).ready()
相同的效果;所以你不用需要在该脚本中再使用它们)
这样您就不必担心 JS 代码中的 XML 特殊字符。作为额外的好处,这使您有机会让浏览器缓存 JS 文件,从而使总响应大小更小。
另见:
关于javascript - 实体名称必须紧跟实体引用中的 '&',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16303779/