2011-01-11 6 views
0

내 HTML + GWT 앱에 키보드 단축키를 추가하고 싶지만 텍스트 영역에 입력하거나 키보드를 사용하여 선택 메뉴를 조작하는 경우 작업을 실행하지 않으려합니다.사용자가 텍스트 입력 컨트롤을 사용하고 있는지 여부를 확인하는 방법이 있습니까?

요소가 활발하게 키보드 이벤트를 사용하고 있는지 여부를 확인할 수있는 방법이 있습니까? Gmail은 GWT를 사용하지 않고 멋지게 구현하지만 실제로는 사용하지 않습니다.

하나 개의 솔루션이 생성되는 키 누르기 이벤트에 stopPropogation을 내 응용 프로그램에있는 모든 단일 제어에 이벤트 핸들러를 추가하고 호출 할 수 있습니다,하지만 그건 내가는 동안 화재 싶어 다른 eventhandlers을 위태롭게 사용자가 입력 중입니다.

업데이트 : 문제의 재 작성 :

  • 나는 사이트를 탐색하는 키 입력에 응답하는 DOM에 KeyPressHandler을 첨부 할. "도움말을 열려면 h를 누르십시오"또는 "메뉴로 이동하려면 m을 누르십시오."그런 종류의 것. 그러나 나는 을 입력하지 마십시오 사용자가 텍스트 상자에 입력하는 중이라면이 KeyPressHandler를 활성화 시키시겠습니까? 나는 그들이 타이핑하고있는 것에서 벗어나고 싶지 않을 것이다. 따라서 사용자가 타이핑 할 수있는 앱의 어느 위치에서나 이러한 이벤트를 필터링 할 수있는 방법이 필요합니다.

답변

0

다음은 대안입니다. 초기 대상 요소가 textarea 또는 input인지 확인한 후 도움을 트리거하지 않습니다. 다른 요소의 경우 도움말을 실행하고 이벤트를 취소합니다.

Event.addNativePreviewHandler(new NativePreviewHandler() { 
    @Override 
    public void onPreviewNativeEvent(NativePreviewEvent event) { 
    if (event.getTypeInt() == Event.ONKEYPRESS) { 
     final String tn = Element.as(event.getNativeEvent().getEventTarget()).getTagName();   

     if (!"textarea".equalsIgnoreCase(tn) && !"input".equalsIgnoreCase(tn)) { 
     event.cancel(); // this will prevent the event from being fired. 
     // add your help handling here 
     if (event.getNativeEvent().getCharCode() == 'h' || event.getNativeEvent().getCharCode() == 'H') 
      Window.alert("help"); 
     } 
     } 
    } 
}); 
0

조금 비트는 janky 하나 개 솔루션은 발견 :

  • 모든 단일 이벤트 내가 의존하고있어
  • 이 핸들러 진행됩니다 때문에

    Event.addNativePreviewHandler(new NativePreviewHandler() 
        { 
         @Override 
         public void onPreviewNativeEvent(NativePreviewEvent event) 
         { 
          if (event.getTypeInt() == Event.ONKEYPRESS && (event.getNativeEvent().getCharCode() == 'h' || event.getNativeEvent().getCharCode() == 'H')) 
          { 
           String targetType = event.getNativeEvent().getEventTarget().toString(); 
           if (targetType.contains("HTMLHtmlElement")) 
           { 
            helpTab.simulateClick(); 
           } 
          } 
         } 
        }); 
    

    이 나쁜 것 같다 매우 안정적이지 않은 디버그 문자열에서. target instanceof HtmlElement과 같은 것이 있습니까?

이 대답을 지금 사용하겠습니다.하지만 더 좋은 해결책으로 체크 표시가되어 드리겠습니다.

0

AFAIK 요소에 포커스가 있는지 직접 확인할 방법이 없습니다. 그러나 요소가 포커스를받을 때 트리거되는 FocusHandler를 설치할 수 있습니다.

textBox.addFocusHandler(new FocusHandler() { 
     @Override 
     public void onFocus(FocusEvent event) { 
       // your element is now focused 
     } 
    }); 
0

Focus의 텍스트 입력에 대한 키 누르기 핸들러를 비활성화하십시오. onBlur를 다시 활성화하십시오. FocusHandler 및 BlurHandler에 대한 설명서를 참조하십시오.

관련 문제