JSF 组件未在 <script> 块内解析
JSF components not parsed inside a <script> block
我不得不更改 JSF 页面中的 <script> ... </script>
并尝试评估脚本内的 JSF 组件。 EL 已评估,但标签本身未受影响。
这种行为的原因是什么?
示例:
<script type="text/javascript">
//<![CDATA[
function doSomething() {
$('.userNode').droppable({
activeClass : 'ui-state-active',
hoverClass : 'ui-state-highlight',
tolerance : 'intersect',
drop : function(event, ui) {
<h:panelGroup rendered="#{myBean.useThis}">
alert("code A");
</h:panelGroup>
<h:panelGroup rendered="#{!myBean.useThis}">
alert("code B");
</h:panelGroup>
}
});
};
//]]> </script>
EL #{!myBean.useThis}
被评估为 true/false 但 <h:panelGroup>
在渲染结果中。
为什么?
这是因为您将它放在了 CDATA 块中。 CDATA 块内的任何内容都被视为字符数据,而不是 XML 数据。
最好不要这样做。这是一种不好的做法。将 JS 函数放在它自己的 .js
文件中。使用 JSF/EL 仅用于准备 JS 函数随后将请求(作为方法参数)或自行访问(在 window 范围内)的 JavaScript 变量,而不是填充部分 JS 函数。
例如
<h:outputScript>var useThis = #{myBean.useThis};</h:outputScript>
<h:outputScript name="script.js" />
function doSomething() {
$('.userNode').droppable({
activeClass : 'ui-state-active',
hoverClass : 'ui-state-highlight',
tolerance : 'intersect',
drop : function(event, ui) {
if (useThis) {
alert("code A");
}
else {
alert("code B");
}
}
});
}
要防止全局范围的污染,请考虑创建命名空间。
<h:outputScript>var my = my||{}; my.useThis = #{myBean.useThis};</h:outputScript>
if (my.useThis) {
alert("code A");
}
else {
alert("code B");
}
另请参阅:
- Error parsing XHTML: The content of elements must consist of well-formed character data or markup
我不得不更改 JSF 页面中的 <script> ... </script>
并尝试评估脚本内的 JSF 组件。 EL 已评估,但标签本身未受影响。
这种行为的原因是什么?
示例:
<script type="text/javascript">
//<![CDATA[
function doSomething() {
$('.userNode').droppable({
activeClass : 'ui-state-active',
hoverClass : 'ui-state-highlight',
tolerance : 'intersect',
drop : function(event, ui) {
<h:panelGroup rendered="#{myBean.useThis}">
alert("code A");
</h:panelGroup>
<h:panelGroup rendered="#{!myBean.useThis}">
alert("code B");
</h:panelGroup>
}
});
};
//]]> </script>
EL #{!myBean.useThis}
被评估为 true/false 但 <h:panelGroup>
在渲染结果中。
为什么?
这是因为您将它放在了 CDATA 块中。 CDATA 块内的任何内容都被视为字符数据,而不是 XML 数据。
最好不要这样做。这是一种不好的做法。将 JS 函数放在它自己的 .js
文件中。使用 JSF/EL 仅用于准备 JS 函数随后将请求(作为方法参数)或自行访问(在 window 范围内)的 JavaScript 变量,而不是填充部分 JS 函数。
例如
<h:outputScript>var useThis = #{myBean.useThis};</h:outputScript>
<h:outputScript name="script.js" />
function doSomething() {
$('.userNode').droppable({
activeClass : 'ui-state-active',
hoverClass : 'ui-state-highlight',
tolerance : 'intersect',
drop : function(event, ui) {
if (useThis) {
alert("code A");
}
else {
alert("code B");
}
}
});
}
要防止全局范围的污染,请考虑创建命名空间。
<h:outputScript>var my = my||{}; my.useThis = #{myBean.useThis};</h:outputScript>
if (my.useThis) {
alert("code A");
}
else {
alert("code B");
}
另请参阅:
- Error parsing XHTML: The content of elements must consist of well-formed character data or markup