到目前为止发布的所有答案都给出了正确的解决scheme,但没有人能够正确解释具体问题的根本原因。
Facelets是一种基于XML的视图技术,它使用XHTML + XML来生成HTML输出。 XML有五个特殊字符,它们由XMLparsing器进行特殊处理:
标签的开始
>标签的结尾。
"一个属性值的开始和结束。
'属性值的替代开始和结束。
&实体的开始(以;结尾)。
如果&没有跟在# (例如 等等),XMLparsing器隐式地查找五个预定义的实体名称 lt , gt , amp , quot和apos或任何手动定义的实体名称 。 但是,在您的具体情况下,您使用&作为JavaScript运算符,而不是XML实体。 这完全解释了你得到的XMLparsing错误:
实体名称必须紧跟在实体引用中的“&”之后
实质上,您是在错误的地方编写JavaScript代码,而不是JS文件的XML文档,所以您应该相应地转义所有的XML特殊字符。 &必须以& 。
所以,在你的具体情况下,
if (Modernizr.canvas && Modernizr.localstorage &&
必须成为
if (Modernizr.canvas && Modernizr.localstorage &&
使其成为XML有效。
但是,这使JavaScript代码难以阅读和维护。 正如Mozilla开发者networking的优秀文档“为JavaScript编写XHTML”所述 ,您应该将JavaScript代码放在字符数据(CDATA)块中。 因此,在JSF中,这将是:
XMLparsing器会将块的内容解释为“普通香草”字符数据,而不是XML,因此将“原样”解释为XML特殊字符。
但是,更好的办法就是把JS代码放在你自己的JS文件中,这个JS文件包含在
(注意target="body" ;通过这种方式,JSF将自动将
这样你就不用担心你的JS代码中的XML特殊字符。 作为额外的好处,这使您有机会让浏览器cachingJS文件,以使总体响应规模更小。
也可以看看:
错误分析/page.xhtml:跟踪错误[line:42]实体“nbsp”被引用,但未声明
是否有可能使用JSF + Facelets与HTML 4/5?
如何在Facelets模板中引用CSS / JS / image资源?
为XHTML编写JavaScript