Javascript 在验证错误时将焦点设置为inputText

Javascript 在验证错误时将焦点设置为inputText,javascript,validation,jsf,focus,Javascript,Validation,Jsf,Focus,我想在JSF中,当特定的inputText出现验证错误时,将焦点设置在inputText字段上。我如何实现这一点 我原以为inputText上的Validator消息可以做到这一点,但它似乎没有。没有这种默认行为。您需要自己实现它,或者使用第三方库来完成此任务。基本上,在渲染响应期间,您需要遍历所有组件的提交表单,找到第一个返回值为false的组件,然后将其客户端ID存储在请求映射中,以便将其作为JS变量打印 form.visitTree(VisitContext.createVisitCont

我想在JSF中,当特定的inputText出现验证错误时,将焦点设置在inputText字段上。我如何实现这一点


我原以为inputText上的Validator消息可以做到这一点,但它似乎没有。

没有这种默认行为。您需要自己实现它,或者使用第三方库来完成此任务。基本上,在渲染响应期间,您需要遍历所有组件的提交表单,找到第一个返回值为
false
的组件,然后将其客户端ID存储在请求映射中,以便将其作为JS变量打印

form.visitTree(VisitContext.createVisitContext(),new VisitCallback()){
@凌驾
公共访问结果访问(VisitContext上下文,UIComponent组件){
if(UIInput&!((UIInput)component.isValid()的组件实例){
context.getFacesContext().getExternalContext().getRequestMap()
.put(“焦点”,component.getClientId(context.getFacesContext());
返回VisitResult.COMPLETE;
}
返回VisitResult.ACCEPT;
}
});
然后可以使用以下脚本设置焦点:


var focus='#{focus}';
如果(焦点){
document.getElementById(focus.focus();
}

JSF实用程序库为此提供了一个可重用的组件(源代码和showcase演示)。此外,它还为无效输入设置了一个styleclass,以便您可以通过CSS指定不同的背景颜色。

感谢您提供的解决方案BalusC。尝试实现上面详述的内容,但不幸的是,requiredMessage/validatorMessage似乎是在到达呈现响应中的“我的代码”之前抛出的。有什么办法可以解决这个问题吗?感谢您的帮助正如我在回答中所说的,您需要在渲染响应阶段执行该工作,而不是在调用操作阶段的某些命令按钮操作方法中执行该工作。为此,您可以使用自定义组件(如OmniFaces)或
PhaseListener
。创建了一个PhaseListener,并尝试在afterPhase方法和beforePhase方法中放置与您类似的代码,在beforePhase方法中,getPhaseId方法也设置为返回RENDER\u响应。不幸的是,我的代码只有在加载页面时才会被命中,当我的提交按钮被点击时,不会再被点击。你知道我在这里哪里出错了吗?谢谢您的时间。应该在
beforePhase()中完成。对于每一个请求,都应该调用它。可能您对问题的解释是错误的(即,您没有检查该方法是否确实由调试器/记录器调用,而是检查结果是否符合预期)。啊,我的错误,代码完全不同步,因此我的调试完全错误。在我的代码中,我执行以下操作:FacesContext FacesContext=event.getFacesContext();UIComponent inputField=facesContext.getViewRoot();然后,当我在您提供给我的if条件下检查强制转换时,它给出了一个ClassCastException(UIPortletViewRoot到UIInput),因此这似乎是我的问题。