jsf - JSF 表单验证失败后滚动到 anchor 或页面底部

标签 jsf

我在页面底部有一个联系表单,其中包含必填和经过验证的表单字段。如果验证失败,如何让滚动位置回到页面底部?

我希望此页面在禁用 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/

相关文章:

java - JSF SelectOneMenu 获取实体

jsf - 实现NamingContainer的组件列表

java - JSF 不报告未定义的 bean

javascript - FireFox 4 不再支持可滚动的 TBody - 解决方法?

JSF : java. lang.IllegalStateException:Client-id:_idJsp35 在 Alfresco Web 客户端的面孔树中重复

css - 如何使用 richfaces 和 CSS 在 JSF 应用程序中添加背景图像?

css - h :dataTable always displays one row; won't display zero rows

java - 仅针对特定组件的 ajaxStatus

javascript - 使用 widgetVar,如何禁用或启用 PrimeFaces selectOneButton

java - Primefaces 树表 : Deleting node using p:ajax not work