为了账号安全,请及时绑定邮箱和手机立即绑定

实体名称必须紧随实体引用中的“&”

实体名称必须紧随实体引用中的“&”

猛跑小猪 2019-09-21 11:44:00
我想在我的* .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 && 我得到:实体名称必须紧随实体引用中的“&”之后。任何想法如何解决?
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

到目前为止,所有发布的答案都给出了正确的解决方案,但是没有人能够正确解释具体问题的根本原因。


Facelets是基于XML的视图技术,它使用XHTML + XML生成HTML输出。XML具有五个特殊字符,XML解析器对其进行了特殊处理:


< 标签的开始。

> 标签的结尾。

" 属性值的开始和结束。

' 属性值的替代开始和结束。

&实体的开头(以结尾;)。

在箱子&,其后面没有#(例如&#160;,&#xA0;等),XML解析器被隐含找五个一预定义的实体名称 lt,gt,amp,quot和apos,或任何手动定义实体名称。但是,在您的特定情况下,您使用的&是JavaScript运算符,而不是XML实体。这完全解释了您遇到的XML解析错误:


实体名称必须紧随实体引用中的“&”


本质上,您在错误的位置编写了JavaScript代码,而不是JS文件而不是JS文件,因此您应该相应地转义所有XML特殊字符。在&必须进行转义为&amp;。


因此,在您的特定情况下,


if (Modernizr.canvas && Modernizr.localstorage && 

必须成为


if (Modernizr.canvas &amp;&amp; Modernizr.localstorage &amp;&amp;

使它对XML有效。


但是,这使JavaScript代码更难以阅读和维护。如Mozilla开发人员网络出色的文档“为XHTML编写JavaScript”所述,您应该将JavaScript代码放在字符数据(CDATA)块中。因此,按照JSF的说法,它将是:


<h:outputScript>

    <![CDATA[

        // ...

    ]]>

</h:outputScript>

XML解析器会将块的内容解释为“普通香草”字符数据,而不是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文件,从而减小总响应大小。


查看完整回答
反对 回复 2019-09-21
?
FFIVE

TA贡献1797条经验 获得超6个赞

解析器期望一些HTML内容,因此它将&视为实体的开始,例如&egrave;。


使用以下解决方法:


<script type="text/javascript">

// <![CDATA[

Javascript code here

// ]]>

</script>

因此,您指定代码不是HTML文本,而只是按原样使用的数据。

查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 1563 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信