我在页面底部有一个联系表单,其中包含必填和经过验证的表单字段。如果验证失败,如何让滚动位置回到页面底部?
我希望此页面在禁用 Javascript 的情况下工作,因此没有 AJAX 解决方案。我有这样的东西:
<a id="contact"></a>
<h:form id="cform">
<h5>Contact!</h5>
<h:outputLabel for="name">Name:
<h:message id="nameMsg" for="name" />
</h:outputLabel>
<h:inputText id="name" value="#{bean.name}" required="true" requiredMessage="Please enter name!" />
<h:outputLabel for="email">Email:
<h:message id="emailMsg" for="email" />
</h:outputLabel>
<h:inputText id="email" value="#{bean.email}" required="true" requiredMessage="Email is required!">
<f:validator validatorId="myValidator" />
</h:inputText>
<h:outputLabel for="comment">Comment:
<h:message id="commentMsg" for="comment" />
</h:outputLabel>
<h:inputTextarea id="comment" value="#{bean.comment}" required="true" requiredMessage="Please enter a comment!"/>
<h:commandButton action="#{bean.go}" id="send" value="send" />
</h:form>
我考虑过在 bean 端进行验证并手动重定向到适当的 anchor ,但这似乎违背了使用 JSF 的初衷。我认为有一个简单的方法可以做到这一点,但我在谷歌搜索解决方案时遇到了麻烦,因为我可能没有正确地措辞问题。有谁吗?
最佳答案
您可以使用 <f:event type="postValidate">
在验证阶段之后立即有一个监听器 Hook 。您可以使用 FacesContext#isValidationFailed()
检查验证是否失败。您可以使用 Flash#setKeepMessages()
让面孔消息在重定向后继续存在(即默认情况下,它们处于请求范围内!)。您可以使用 ExternalContext#redirect()
在非操作方法中执行重定向。
所以,总结一下,应该这样做:
<h:form id="cform">
...
<f:event type="postValidate" listener="#{bean.postValidate}" />
</h:form>
与:
public void postValidate() throws IOException {
FacesContext context = FacesContext.getCurrentInstance();
if (context.isValidationFailed()) {
context.getExternalContext().getFlash().setKeepMessages(true);
context.getExternalContext().redirect("contact.xhtml#cform");
}
}
关于jsf - JSF 表单验证失败后滚动到 anchor 或页面底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12378974/