luc*_*gel 38 javascript xhtml jsf facelets jsf-2
作为这个问题的扩展,我试图将Javascript插入到已经呈现ajax表<h:commandButton />
的onclick
属性action
中.
我想做什么:在列表框中获取所选项目并将其转换为要在JSF中使用的参数FileServlet
.即para2=value1¶m=value2¶m=value3
这就是我所拥有的:
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId('myForm:box');
var length = box.options.length;
var paramstring = "";
for (var i = 0; i < length; i++) {
if (i != (length - 1) {
if (box.options[i].selected) {
paramstring = paramstring + "param=" + box.options[i].value + "&";
}
} else {
paramstring = paramstring + "param=" + box.options[i].value;
}
}
if (document.getElementById('myForm:checkbox').checked) {
window.location='fileServlet? + paramstring;
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
加载页面时得到的结果:
javax.servlet.ServletException: Error Parsing /page.xhtml: Error Traced[line:15] The content of elements must consist of well-formed character data or markup.
什么不会触发异常:
<script type ="text/javascript">
function myScript() {
var box = document.getElementbyId('myForm:box');
var length = box.options.length;
var paramstring = "";
if (document.getElementById('myForm:checkbox').checked) {
window.location='fileServlet? + paramstring;
}
}
</script>
Run Code Online (Sandbox Code Playgroud)
只要我加入for (var i = 0; i < length; i++)
甚至for (var i = 0; i < 10; i++)
页面都不会加载.为什么它不喜欢for循环?
Bal*_*usC 90
Facelets是一种基于XML的视图技术,它使用XHTML + XML生成HTML输出.XML有五个特殊字符,由XML解析器进行特殊处理:
<
标签的开头.>
标签的结尾."
属性值的开始和结束.'
属性值的替代开始和结束.&
实体的开头(以...结尾;
).在这种情况下<
,XML解析器隐式查找标记名称和结束标记>
.但是,在您的特定情况下,您使用的<
是JavaScript运算符,而不是XML实体.这完全解释了您获得的XML解析错误:
元素的内容必须由格式良好的字符数据或标记组成.
实质上,您在错误的位置编写JavaScript代码,XML文档而不是JS文件,因此您应该相应地转义所有XML特殊字符.在<
必须进行转义为<
.
所以,基本上,
for (var i = 0; i < length; i++) {
Run Code Online (Sandbox Code Playgroud)
必须成为
for (var i = 0; i < length; i++) {
Run Code Online (Sandbox Code Playgroud)
使其具有XML有效性.
但是,这使得JavaScript代码更难以阅读和维护.正如Mozilla Developer Network的优秀文档Writing JavaScript for XHTML中所述,您应该将JavaScript代码放在字符数据(CDATA)块中.因此,在JSF术语中,那将是:
<h:outputScript>
<![CDATA[
// ...
]]>
</h:outputScript>
Run Code Online (Sandbox Code Playgroud)
XML解析器将块的内容解释为"普通的vanilla"字符数据而不是XML,因此将"特殊字符"解释为"原样".
但是,更好的是将JS代码放在它自己的JS文件中<script src>
,或者用JSF术语表示<h:outputScript>
.
<h:outputScript name="functions.js" target="head" />
Run Code Online (Sandbox Code Playgroud)
这样您就不必担心JS代码中的XML特殊字符了.
Mik*_*keR 19
今天我遇到了这个帖子,因为我遇到了同样的问题,并且遇到了与上面列出的CDATA标签一起运行的javascript问题.我更正了CDATA标签,如下所示:
<script type="text/javascript">
//<![CDATA[
your javascript code here
//]]>
</script>
Run Code Online (Sandbox Code Playgroud)
然后一切都很完美!
小智 6
有时你会需要这个:
/*<![CDATA[*/
/*]]>*/
Run Code Online (Sandbox Code Playgroud)
而且不仅如此:
<![CDATA[
]]>
Run Code Online (Sandbox Code Playgroud)