【发布时间】:2013-02-27 12:56:59
【问题描述】:
我正在开发一个 Spring3/JSF2/Primefaces3.5 应用程序。
我面临的问题是某些 Primefaces 组件 (p:autocomplete、p:calendar 和 p:selectOneMenu) 无法在浏览器中正确呈现。 该问题在许多页面中随机出现。 如果我重新加载页面(例如通过 F5 键),问题就会得到纠正,并且组件会按应有的方式呈现。
.xhtml 文件:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:p="http://primefaces.org/ui">
<h:form id="mainForm">
....
<f:validateBean>
<table class="listing form" cellpadding="0" cellspacing="0">
...
(some p:inputText elements)
...
<tr class="bg">
<td class="first"><strong>Marque :</strong></td>
<td class="last">
<p:autoComplete
label="Marque"
value="#{montureBean.marque}"
completeMethod="#{montureBean.autocompleteMarque}"
var="item"
itemLabel="#{item.intitule}"
itemValue="#{item}"
converter="#{montureBean.marqueConverter}"
dropdown="true"/>
<p:commandLink onclick="dlgMarque.show()" immediate="true">
<img src="/images-main/add-icon.gif" border="0" alt="Ajouter Marque" class="img-action"/>
</p:commandLink>
</td>
</tr>
<tr class="bg">
<td class="first"><strong>Matière :</strong></td>
<td class="last">
<p:autoComplete
label="Matière"
value="#{montureBean.matiere}"
completeMethod="#{montureBean.autocompleteMatiere}"
var="item"
itemLabel="#{item.intitule}"
itemValue="#{item}"
converter="#{montureBean.matiereConverter}"
dropdown="true"/>
<p:commandLink onclick="dlgMatiere.show()" immediate="true">
<img src="/images-main/add-icon.gif" border="0" alt="Ajouter Matière" class="img-action"/>
</p:commandLink>
</td>
</tr>
</table>
</f:validateBean>
</h:form>
</ui:composition>
下面是 p:autocomplete 生成代码的示例:
错误的渲染:
<span aria-multiline="false" aria-disabled="false" role="textbox" id="mainForm:j_id_q_1i" class="ui-autocomplete">
<input id="mainForm:j_id_q_1i_input" name="mainForm:j_id_q_1i_input" class="ui-autocomplete-input ui-inputfield ui-widget ui-state-default ui-corner-left" autocomplete="off" value="" type="text">
<input id="mainForm:j_id_q_1i_hinput" name="mainForm:j_id_q_1i_hinput" autocomplete="off" value="0" type="hidden">
<button class="ui-button ui-widget ui-state-default ui-corner-right ui-button-icon-only" type="button">
<span class="ui-button-icon-primary ui-icon ui-icon-triangle-1-s"></span>
<span class="ui-button-text"> </span>
</button>
<div id="mainForm:j_id_q_1i_panel" class="ui-autocomplete-panel ui-widget-content ui-corner-all ui-helper-hidden ui-shadow"></div>
</span>
正确的渲染:
<span id="mainForm:j_id_q_1i" class="ui-autocomplete">
<input id="mainForm:j_id_q_1i_input" name="mainForm:j_id_q_1i_input" type="text" class="ui-autocomplete-input ui-inputfield ui-widget ui-state-default ui-corner-left" autocomplete="off" value="" />
<input id="mainForm:j_id_q_1i_hinput" name="mainForm:j_id_q_1i_hinput" type="hidden" autocomplete="off" value="0" />
<button class="ui-button ui-widget ui-state-default ui-corner-right ui-button-icon-only" type="button">
<span class="ui-button-icon-primary ui-icon ui-icon-triangle-1-s"></span>
<span class="ui-button-text"> </span>
</button>
<div id="mainForm:j_id_q_1i_panel" class="ui-autocomplete-panel ui-widget-content ui-corner-all ui-helper-hidden ui-shadow"></div>
</span>
<script id="mainForm:j_id_q_1i_s" type="text/javascript"><!--
$(function(){PrimeFaces.cw('AutoComplete','widget_mainForm_j_id_q_1i',{id:'mainForm:j_id_q_1i'});});
//--></script>
我注意到:
- 许多属性分配给第一个跨度而不是输入,
- 两个输入元素在错误的渲染中没有关闭>代替/>
- 有一个 javascript 函数出现在正确的渲染中,我们在错误的情况下看不到。
这是一个错误还是我做错了什么。 注意:我使用 p:layout 进行页面组织,使用 f:validation 验证输入元素。
【问题讨论】:
-
你能显示xhtml页面吗?尤其是
DOCTYPE定义。 -
感谢您的关注我更新了我的帖子
-
我仍然没有看到
DOCTYPE的定义。在顶级页面的某处找到它,因为这是某个模板的一部分。如果不存在,请将<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">作为顶级xhtml文件的第一行。 -
我有一个 index.xhtml 文件,它通过 ui:include 调用上述 xhtml 文件。 index.html 以 开头。下一行包含您所说的文档类型: ttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" rel="nofollow" target="_blank">w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
标签: javascript jsf autocomplete primefaces rendering