当我通过a4j执行reRender:在h:selectOneRadio上支持Richfaces(3.3.3)时,我有一种奇怪的行为(不是每次都有)。
这是我的xhtml部分,其中包含h:selectOneRadio:
<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>
一切都很好。
但是当这个是另一个组件的reRender时,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代码?
感谢。
答案 0 :(得分:1)
经过多次搜索后,该错误来自neko。
为了优化性能,我改变了neko的xml解析(默认为微小),这个可以打破html。
答案 1 :(得分:0)
RichFaces 3 AJAX响应与Content-Type: text/xml
标头一起提供。
因此,它们应该是有效的XML,并且在浏览器端由RichFaces JavaScript客户端代码进行解析。
另一方面,从模板生成的HTML不需要是有效的XML,因此当RichFaces重新呈现模板的片段时,it tidies it up by default with the Tidy parser以避免在客户端解析问题。
通常建议使用NekoHTML替换Tidy解析器以获得更好的性能。 但是,NekoHTML在整理过程中可能会走得太远,并且会破坏一些RichFaces / JSF组件,主要是那些基于HTML元素的组件。
例如,自版本1.9.13,NekoHTML automatically adds TBODY around TR nested directly within TABLE。 降级到5.5岁版本1.9.12会恢复此行为并修复组件的重新呈现。 但这不是IMHO的选择,因为过去几年已经修复了很多问题。
根据我的经验,获得表现并避免这些问题的更好方法是:
确保模板的重新呈现部分是有效的XML
放弃整理解析器
对应的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>