2012-06-26 3 views
0

특정 inputText에 대한 유효성 검사 오류가있을 때 JSF의 inputText 필드에 포커스를 설정하려고합니다. 어떻게 구현할 수 있습니까?유효성 검사 오류시 inputText에 포커스 설정

inputText의 validatorMessage를 사용하면이 작업을 수행 할 수 있다고 생각했지만 그렇지 않습니다.

답변

1

이러한 기본 동작은 없습니다. 작업을 직접 구현하거나 타사 라이브러리를 사용해야합니다. 기본적으로 렌더링 응답 중에 모든 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에 의해 다른 배경색을 지정할 수 있도록 무효화 된 입력에 styleclass를 설정합니다.

+0

솔루션 BalusC에 감사드립니다. 위에서 설명한 내용을 구현하려고 시도했지만 불행히도 requiredMessage/validatorMessage는 렌더링 응답에있는 코드에 도달하기 전에 던져진 것처럼 보입니다. 이 문제를 해결하는 방법에 대한 아이디어가 있으십니까? 도움이 당신의 도움을 주셔서 감사합니다 – damien535

+0

내 대답에 말했듯이, 당신은 렌더링 응답 단계 중에 작업을 수행 할 필요가 일부 명령 단추 동작 방법 호출 동작 단계 중에. OmniFaces와 같은 맞춤 구성 요소 또는 'PhaseListener'를 사용할 수 있습니다. – BalusC

+0

PhaseListener를 만들고 afterPhase 메서드와 beforePhase 메서드에서 유사한 코드를 배치하려고 시도했지만 getPhaseId 메서드도 RENDER_RESPONSE를 반환하도록 설정되었습니다. 불행히도 페이지가로드 될 때만 코드가 적용되고 내 코드는 다시 히트하지 않습니다. 제출 버튼을 클릭합니다. 내가 어디에서 잘못 읽었을 지 아십니까? 시간 내 줘서 고마워. – damien535

관련 문제