2014-12-09 2 views
1

Glassfish 4.1에서 PF 5.1, JSF 2.2.7을 사용합니다.SelectOneMenu는 ALT에서 변경 이벤트를 재설정하고 실행합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
    xmlns:f="http://xmlns.jcp.org/jsf/core"> 
<h:head> 
    <title>Test</title> 
</h:head> 
<h:body> 
    <h:form> 

     <p:selectOneMenu value="#{testBean.text}"> 
      <p:ajax listener="#{testBean.test()}" update="outputpanel"/> 
      <f:selectItem itemLabel="1" itemValue="1"/> 
      <f:selectItem itemLabel="2" itemValue="2"/> 
      <f:selectItem itemLabel="3" itemValue="3"/> 
     </p:selectOneMenu> 

     <p:outputPanel id="outputpanel"> 
      #{testBean.text} 
     </p:outputPanel> 

    </h:form> 
</h:body> 
</html> 

콩 :

은 내가 selectOneMenu이 간단한 예를

import java.io.Serializable; 
import javax.annotation.PostConstruct; 
import javax.faces.view.ViewScoped; 
import javax.inject.Named; 

@Named 
@ViewScoped 
public class TestBean implements Serializable 
{ 
private String text; 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    System.out.println("settext: " + text); 
    this.text = text; 
} 

public void test() { 
    System.out.println("test called"); 
} 

} 

그것은 제외하고 예상대로 작동하는 드롭 다운 포커스가 나는에 Windows 또는 CMD에서 ALT 키를 누르면 맥 그것은 수신기를 호출하고 또한 드롭 다운을 재설정합니다. 이것은 드롭 다운이 기본값 (이미 2 또는 3)에 있지 않을 때 발생합니다. 그리고 이것은 다른 열린 프로그램에서 무언가를 검사하기 위해 예를 들어 ALT + TAB을 누를 수 없다는 것을 의미합니다. 다시 돌아 오면 재설정 될 것입니다.

왜이 악의적 인 행동과 그것을 피하는가? 나는 event="change"을 발사하고 구성 요소를 재설정하기 위해 ALT에 언론을 가지지 않을 것입니다.

답변

5

이것은 JavaScript의 버그입니다 (<p:selectOneMenu>). 키보드를 통해 메뉴 항목을 필터링 할 때 그것은 (B, 1, 2, ) 문자 키와 컨트롤 키 (Alt 키, Ctrl 키 등)을 구별 아닙니다.

기본적으로 PrimeFaces.widget.SelectOneMenu 파일의 primefaces.js 파일의 개체 정의에서 on("keyup.ui-selectonemenu", function...).on("keypress.ui-selectonemenu", function...)으로 대체되어야합니다. keypress 이벤트는 문자 키를 누를 때만 트리거됩니다. 이 방법으로 전체 switch 수표도 제거 할 수 있습니다.

  1. /javax.faces.resource/primefaces.js.xhtml?ln=primefaces의 사본을 얻고 당신의 웹 애플리케이션에 /resources/primefaces/primefaces.js로 저장합니다. WAR의 리소스는 JAR보다로드 우선 순위가 높습니다.

  2. Ctrl + F를 keyup.ui-selectonemenu으로 바꾸고 이것을 keypress.ui-selectonemenu으로 바꿉니다.

  3. 저장.

  4. 이익.

한편이 문제는 PrimeFaces 친구들에게보고하여 문제를 올바르게 해결할 수 있도록하십시오. 수정 사항이 릴리스되면 사용자 정의 스크립트를 제거 할 수 있습니다.

+0

감사합니다. BalusC. 잘 하셨어요. –

+0

반갑습니다. – BalusC

+0

@BalusC : 큰 도움을 주셔서 감사합니다. 우리는 primefaces 5.1 및 5.2에서이 문제를 여러분의 제안으로 수정했습니다. 이제 우리는 primefaces 6.0으로 업그레이드했습니다. 이제 다시 동일한 문제가 발생합니다. 6.0에서는 keydown을 사용했습니다. 나는 당신의 해결책을 시도했지만 운이 없었다. 도와주세요. – Srikanth

3

저는 BalusC에 대한 답변 만 대답했습니다. 나는 동일한 문제를 겪고이 해결책은 그것을 해결한다.

먼저 감사합니다. BalusC!

그러나 아래 필터 라인 '의 키를'을 '의 keyup'을 변경하지 마십시오주의 :

this.filterInput.on("keyup.ui-selectonemenu",function(... 

만 이스케이프 키 핸들 :

c.ESCAPE:a.handleEscapeKey(d);break}}).on("keypress.ui-selectonemenu" 

그렇지 않으면 당신은 필터에 문제가있는 것 제대로 작동하지 않습니다. 예를 들어 처음 입력 된 char은 목록을 필터링하지 않습니다. 모든

-1

Thankq 매우 BaluC

작은 조언에

감사 : 나는 primefaces 5.2 함께 일하고 있어요 및 문제 이상 만 firfox에서 시뮬레이션 IE 남아있는 크롬은 잘 작동된다. 우리는 필터 = "true"로 줄 때 그래서 내가 당신이 말한대로

(window.navigator.userAgent.indexOf("Firefox")>0) ? "keyup.ui-selectonemenu" : "keypress.ui-selectonemenu" 

아래 같은 JS 코드를 수정, 내가 탈출 키 핸들 및 필터 주어 잘 노력하고 있습니다. 그러나 filter = "true"를 지정하면 selectonemenu에 포커스가있을 때 하나의 키 (문자)를 클릭하면 관련 값이 포커스됩니다. 예 : 클릭하면 '시작'단어가 집중됩니다. 이 기능이 작동하지 않습니다.

+0

BalusC 솔루션이 모든 브라우저에서 작동하는 경우 broswer 검사를 추가하면 다른 브라우저에 대한 이전 코드 만 유지할 수 있습니다. 브라우저 점검은 가능한 한 적게 사용해야합니다. 바람직하지 않다. – Kukeltje

관련 문제