如何使p:inputNumber支持键盘输入?解决h:inputText光标定位异常问题
问题解决方案
一、解决p:inputNumber无法手动键盘输入的问题
PrimeFaces的p:inputNumber组件默认仅允许通过增减按钮调整数值,禁用了手动输入。只需添加allowManualInput="true"属性即可开启键盘输入功能,同时保留小数处理能力。另外建议移除style中的direction: rtl,避免输入方向冲突影响体验。
修改后的代码:
<div class="col-12 md:col-6 lg:col-6 xl:col-4"> <div class="field"> <span class="ui-float-label label-button"> <p:inputNumber id="porcentajesolarAgr" required="true" requiredMessage="#{msg['subpropiedad_debe_ingresar_porcentaje_aval']}" symbolPosition="s" decimalSeparator="." thousandSeparator="" value="#{subPropiedadBean.subpropiedad.porcentajeSolarStp}" style="text-align: right;" mode="decimal" allowManualInput="true"/> <p:outputLabel for="porcentajesolarAgr">#{msg['subpropiedad_procentaje_aval']}</p:outputLabel> <p:message for="porcentajesolarAgr"/> </span> </div> </div>
二、解决h:inputText光标默认定位在小数点位置的问题
光标异常是因为设置了direction: rtl(从右往左输入方向),导致初始光标落在小数点区域。提供两种解决方式:
方案1:移除direction:rtl(推荐)
仅保留text-align: right实现文本右对齐,输入方向保持默认的从左到右,光标会自动定位在数字开头。
修改后的代码:
<div class="col-12 md:col-6 lg:col-6 xl:col-4"> <div class="field"> <span class="ui-float-label label-button"> <h:inputText id="porcentajeAgr" required="true" requiredMessage="#{msg['propiedades_debe_ingresar_aval_sib']}" value="#{subPropiedadBean.subpropiedad.porcentajeAvalaSibStp}" converterMessage="#{msg['propiedades_formato_invalido']}" style="text-align: right;"> <f:convertNumber type="number" pattern="#,##0.00" /> </h:inputText> <h:outputLabel for="porcentajeAgr">#{msg['subpropiedad_procentaje_aval']}</h:outputLabel> <h:message for="porcentajeAgr" /> </span> </div> </div>
方案2:保留direction:rtl并通过JS控制光标
如果必须保留direction: rtl,可以通过onfocus事件手动将光标定位到文本开头:
<div class="col-12 md:col-6 lg:col-6 xl:col-4"> <div class="field"> <span class="ui-float-label label-button"> <h:inputText id="porcentajeAgr" required="true" requiredMessage="#{msg['propiedades_debe_ingresar_aval_sib']}" value="#{subPropiedadBean.subpropiedad.porcentajeAvalaSibStp}" converterMessage="#{msg['propiedades_formato_invalido']}" style="text-align: right; direction: rtl;" onfocus="if(this.value.length > 0) this.setSelectionRange(0, 0);"> <f:convertNumber type="number" pattern="#,##0.00" /> </h:inputText> <h:outputLabel for="porcentajeAgr">#{msg['subpropiedad_procentaje_aval']}</h:outputLabel> <h:message for="porcentajeAgr" /> </span> </div> </div>
内容的提问来源于stack exchange,提问作者user18043163
相关产品推荐
相关产品推荐

