2014-01-06 1 views
0

다른 필드의 "onchange"이벤트가 호출 될 때 특정 필드가 동적으로 렌더링되는 JSF 페이지가 있습니다. 또한 버튼 클릭만으로 열리는 팝업 패널이 있습니다.RichFaces에서 팝업 패널 및 동적 렌더링 필드에 초점 설정 4.1.0

<h:form id="testForm"> 
     <h:panelGrid id="testPanel" columns="2"> 
      <h:inputText id="text0" /> 
      <h:inputText id="text1"> 
       <f:ajax event="change" listener="#{popupMBean.renderDynamicData}" 
        render="@form" /> 
      </h:inputText> 
      <h:inputText id="text2" rendered="#{popupMBean.renderDynamic}" /> 
      <h:inputText id="text3" /> 
      <a4j:commandButton id="open" value="Open" render="testPopup" 
       oncomplete="#{rich:component('testPopup')}.show();" /> 
     </h:panelGrid> 
    </h:form> 

    <rich:popupPanel id="testPopup" height="100" 
     domElementAttachment="form" header="Test"> 
     <f:facet name="controls"> 
      <h:commandButton value="Close" 
       onclick="#{rich:component('testPopup')}.hide()"></h:commandButton> 
     </f:facet> 
     <a4j:outputPanel id="test"> 
      <a4j:commandButton id="first" value="First" /> 
      <a4j:commandButton id="second" value="Second" /> 
     </a4j:outputPanel> 
    </rich:popupPanel> 

내가 키보드를 사용하여 모든 필드를 통과 할 필요는 요구 사항이 있습니다 다음은 페이지의 단순화 된 버전입니다. 직면하고있는 문제는 다음과 같다 내가 '열기'버튼을 클릭하면

  1. 는 팝업 패널을 표시하지만 초점이 팝업에서 첫 번째 입력 요소에 설정되어 있지 않습니다.
  2. 사용자가 팝업을 닫으면 포커스는 팝업을 생성 한 필드 또는 필드 옆에 설정해야합니다.
  3. "text1"필드의 변경 이벤트가 호출 된 후 새로 렌더링 된 필드 "text2"대신 포커스가 페이지의 첫 번째 입력 요소 즉 "text0"으로 다시 이동합니다.

감사합니다.

답변

0

다양한 포럼을 거친 후이 문제는 Rich Faces 4.1 (RF-10758)의 버그와 관련이 있음을 발견했습니다.

이 버그는 popupPanel.js 파일을 변경하여 RichFaces 4.2.3 릴리스의 Jboss 커뮤니티에서 해결되었습니다. popupPanel.js에는 "root"(부모 창)와 "this.div"(자식 창)를 비교하는 processAllFocusElements 함수가 있습니다. "루트"는 단순한 DOM 요소이지만 "this.div"는 jQuery 요소 콜렉션이므로 둘 사이의 비교는 항상 실패합니다. 따라서 (root! = this.div.get (0)) 대신 (root! = this.div)를 써야합니다.

하지만 현재 RichFaces 4.2로 마이그레이션 할 수 없습니다.

이 원래의 질문하지만 다른 문제에서 내 문제 (1)을 해결했다
jQuery.extend(RichFaces.ui.PopupPanel.prototype, { 
     processAllFocusElements: function(root, callback) { 
      var idx = -1; 
      var tagName; 
      var formElements = "|a|input|select|button|textarea|"; 
      if (root.focus &amp;&amp; root.nodeType == 1 &amp;&amp; (tagName = root.tagName) &amp;&amp; 
       // Many not visible elements have focus method, we is had to avoid processing them. 
       (idx = formElements.indexOf(tagName.toLowerCase())) != -1 &amp;&amp; 
       formElements.charAt(idx - 1) === '|' &amp;&amp; 
       formElements.charAt(idx + tagName.length) === '|' &amp;&amp; 
       !root.disabled &amp;&amp; root.type != "hidden") { 
       callback.call(this, root); 
      } else { 
       if (root != this.div.get(0)) { 
        var child = root.firstChild; 
        while (child) { 
         if (!child.style || child.style.display != 'none') { 
          this.processAllFocusElements(child, callback); 
         } 
         child = child.nextSibling; 
        } 
       } 
      } 
     } 
     } 
    ) 

여전히 처리 남아 : 그래서 기본 기능을 processAllFocusElements 다음 코드로를 무시하기로 결정했다.