【发布时间】:2012-06-27 16:03:08
【问题描述】:
当特定 inputText 出现验证错误时,我想将焦点设置在 JSF 中的 inputText 字段上。我该如何实现?
我认为 inputText 上的 validatorMessage 会立即执行此操作,但它似乎没有。
【问题讨论】:
标签: javascript validation jsf focus
当特定 inputText 出现验证错误时,我想将焦点设置在 JSF 中的 inputText 字段上。我该如何实现?
我认为 inputText 上的 validatorMessage 会立即执行此操作,但它似乎没有。
【问题讨论】:
标签: javascript validation jsf focus
没有这样的默认行为。您需要自己实现它或使用 3rd 方库来完成这项工作。基本上,在渲染响应期间,您需要遍历所有UIInput 组件的提交表单,并找到isValid() 返回false 的第一个,然后将其客户端ID 存储在请求映射中,以便您可以将其打印为一个 JS 变量。
form.visitTree(VisitContext.createVisitContext(), new VisitCallback() {
@Override
public VisitResult visit(VisitContext context, UIComponent component) {
if (component instanceof UIInput && !((UIInput) component).isValid()) {
context.getFacesContext().getExternalContext().getRequestMap()
.put("focus", component.getClientId(context.getFacesContext()));
return VisitResult.COMPLETE;
}
return VisitResult.ACCEPT;
}
});
那么你可以使用下面的脚本来设置焦点:
<h:outputScript target="body">
var focus = '#{focus}';
if (focus) {
document.getElementById(focus).focus();
}
</h:outputScript>
JSF 实用程序库OmniFaces 有一个可重用的组件<o:highlight>(源代码here 和展示演示here)。此外,它还在无效输入上设置样式类,以便您可以通过 CSS 指定不同的背景颜色。
【讨论】:
PhaseListener。
beforePhase()完成。绝对应该为每个请求调用它。也许您对问题的解释有误(即您没有检查该方法是否实际由调试器/记录器调用,而是检查了结果是否符合您的预期)。