1

当我在 ah:selectOneRadio 上通过 a4j:support of Richfaces (3.3.3) 进行重新渲染时,我有一个奇怪的行为(不是每次都如此)。

这是我的带有 h:selectOneRadio 的 xhtml 部分:

<h:selectOneRadio id="toto" value="#controller.toto}" >
   <f:selectItem itemLabel="#{bundle['oui']}"
   itemValue="#{true}" />
   <f:selectItem itemLabel="#{bundle['non']}"
   itemValue="#{false}" />
</h:selectOneRadio>
<rich:message for="toto" />

当我进入浏览器时,我得到了这个 html 代码:

<table id="formulaire:toto" >
<tbody>
<tr>
<td>
<input id="formulaire:toto:0" type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} } )" value="true" name="formulaire:toto">
<label for="formulaire:toto:0"> oui</label>
</td>
<td>
<input id="formulaire:toto:1" type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} } )" value="false" name="formulaire:toto" checked="checked">
<label for="formulaire:toto:1"> non</label>
</td>
</tr>
</tbody>
</table>

一切都很好。

但是当这个被另一个组件重新渲染时,html会发生变化并且第一个单选元素不在表格中:

<input type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} } )" value="true" id="formulaire:toto:0" name="formulaire:toto" checked="checked">
<label for="formulaire:toto:0"> oui</label>
<table id="formulaire:toto">
<tbody>
<tr>
<td>
    <input type="radio" onchange="A4J.AJAX.Submit('formulaire',event,{'control':this,'similarityGroupingId':'formulaire:support','parameters':{'ajaxSingle':'formulaire:toto','formulaire:support':'formulaire:support'} } )" value="false" id="formulaire:toto:1" name="formulaire:toto"><label for="formulaire:toto:1"> non</label>
</td>
</tr>
</tbody>
</table>

这是一种非常奇怪的行为,它打破了我的风格。

为什么 reRender 会破坏 html 代码?

谢谢。

4

2 回答 2

1

经过多次搜索,该错误来自neko。

为了优化性能,我通过 neko 更改了 xml 解析(默认情况下很小),这可能会破坏 html。

于 2013-07-16T13:59:13.503 回答
0

RichFaces 3 AJAX 响应与Content-Type: text/xml标头一起提供。因此,它们应该是有效的 XML,并由 RichFaces JavaScript 客户端代码在浏览器端进行解析。

另一方面,从模板生成的 HTML 不需要是有效的 XML,因此当 RichFaces 重新渲染模板的片段时,它默认使用 Tidy 解析器对其进行整理,以避免客户端出现解析问题。

通常建议用 NekoHTML 替换 Tidy 解析器以获得更好的性能。然而,NekoHTML 可能在整理过程中走得太远,并且破坏了一些 RichFaces/JSF 组件,主要是那些基于 HTML 元素的组件。

例如,从 1.9.13 版本开始,NekoHTML 自动在 TR 周围添加 TBODY,直接嵌套在 TABLE中。降级到 5.5 年前的 1.9.12 版本会恢复此行为并修复组件的重新渲染。但这不是恕我直言的选择,因为过去几年已经解决了许多问题。

根据我的经验,获得性能并避免这些问题的更好方法是:

  1. 确保模板的重新渲染部分是有效的 XML

  2. 删除整理的解析器

对应的 web.xml 片段:

<context-param>
  <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
  <param-value>NONE</param-value>
</context-param>

为了避免一次中断太多,可以使用模式逐页管理转换:

<context-param>
  <param-name>org.ajax4jsf.xmlparser.ORDER</param-name>
  <param-value>TIDY,NEKO,NONE</param-value>
</context-param>
<context-param>
  <param-name>org.ajax4jsf.xmlparser.TIDY</param-name>
  <param-value>/pages/tidy/.*\.xhtml</param-value>
</context-param>
<context-param>
  <param-name>org.ajax4jsf.xmlparser.NEKO</param-name>
  <param-value>/pages/neko/.*\.xhtml</param-value>
</context-param>
于 2014-10-15T15:42:18.483 回答