3 回答
TA贡献1829条经验 获得超6个赞
Facelets是一种基于XML的视图技术,它使用XHTML + XML生成HTML输出。XML有五个特殊字符,由XML解析器进行特殊处理:
<
标签的开头。>
标签的结尾。"
属性值的开始和结束。'
属性值的替代开始和结束。&
实体的开头(以...结尾;
)。
在这种情况下<
,XML解析器隐式查找标记名称和结束标记>
。但是,在您的特定情况下,您使用的<
是JavaScript运算符,而不是XML实体。这完全解释了您获得的XML解析错误:
元素的内容必须由格式良好的字符数据或标记组成。
实质上,您在错误的位置编写JavaScript代码,XML文档而不是JS文件,因此您应该相应地转义所有XML特殊字符。在<
必须进行转义为<
。
所以,基本上,
for (var i = 0; i < length; i++) {
必须成为
for (var i = 0; i < length; i++) {
使其具有XML有效性。
但是,这使得JavaScript代码更难以阅读和维护。正如Mozilla Developer Network的优秀文档Writing JavaScript for XHTML中所述,您应该将JavaScript代码放在字符数据(CDATA)块中。因此,在JSF术语中,那将是:
<h:outputScript> <![CDATA[ // ... ]]></h:outputScript>
XML解析器将块的内容解释为“普通的vanilla”字符数据而不是XML,因此将“特殊字符”解释为“原样”。
但是,更好的是将JS代码放在它自己的JS文件中<script src>
,或者用JSF术语表示<h:outputScript>
。
<h:outputScript name="functions.js" target="head" />
这样您就不必担心JS代码中的XML特殊字符了
TA贡献1845条经验 获得超8个赞
因为我遇到了同样的问题,并且遇到了与上面列出的CDATA标签一起运行的javascript问题。我更正了CDATA标签,如下所示:
<script type="text/javascript">//<![CDATA[ your javascript code here//]]></script>
然后一切都很完美!
添加回答
举报