2011-08-31 4 views
4

Safari에서 command + keystroke를 가로 채려고합니다.Safari의 명령 + 키 입력 감지

document.onkeypress = handleKeyPress; 

function handleKeyPress(event) { 
    if ("+" === String.fromCharCode(event.charCode) && event.metaKey) { 
     // my code here 
     return false; 
    } 
    return true; 
} 

내가 명령변화= (변화= 내 미국 키보드 +입니다) 공격 때 문을 반환하지 않는 경우, 다음과 같이 저는 이벤트 처리기를 추가 한 참된. 문이 true를 반환 않는 경우

가 나는 경우 문장의 event.metaKey 부분을 제거하고 변화= 충돌합니다. 또한

, 나는 "+"에서에 "="를 일치하는 문자열을 변경하고 (Shift 키와 함께 또는없이) 명령=을 명중 경우 if 문은 true를 반환 않습니다.

+ 키를 shift =라고 가정하지 않고 command + keypress를 실제로 감지하는 방법이 있습니까? event.shiftKey를 확인하십시오. 일부 비 미국 키보드에는 해당되지 않으므로)?

답변

4

우선 Safari에서 뭔가 의미가 있으므로 (즉, 페이지 확대/축소) ⌘ + 단축키를 사용하는 것이 좋습니다. 누군가가 정상적으로 작동하기를 바랄 수도 있습니다. 빌드하는 대상에 따라 이해할 수 있지만 확실하지 않은 경우 기본 바로 가기를 재정의하지 마십시오.

어쨌든 Key events are tricky입니다. keyCode/charCode/속성이 항상 올바른 문자와 일치하지 않기 때문에 String.fromCharCode이 항상 적절한 문자열을 얻지는 않습니다. keyIdentifier은보기에 더 좋은 경우가 있지만 항상 그런 것은 아닙니다 (예 : 문자 키의 코드는 항상 대문자입니다).

내가 과거에 해왔 던 (그리고 이것이 최선의 방법이라고는 확신 할 수 없지만 괜찮습니다) 대신 keydown 및 keyup 이벤트를 수신하고 "스택"수정자를 수신합니다 열쇠. 나는. 키가 누를 때마다 키가 수정 자인지 확인합니다 (예 : cmd, Ctrl, Alt 또는 Shift). 그렇다면 수정 자의 "스택"에 추가하십시오. 키 업과 반대되는 작업을 수행합니다. 릴리스 된 키가 수정자인 경우 스택에서 제거하십시오.

keydown-handler에서 키가 수정 자 키가 아닌 경우 keydown 이벤트 (키 누르기 이벤트와 달리 확인할 수있는 매우 안정적인 keyIdentifier 속성이 있음)를 보낼 수 있습니다. 다른 콜백에 따라 수정 자 스택을 가져 와서 가져옵니다.

귀하의 경우, 그러한 콜백은 cmd 키가 스택에 있는지, keydown 이벤트의 keyIdentifier가 "U + 002B"(+의 유니 코드 코드)인지 확인합니다.

I've put together a jsfiddle example 내가 말하고자하는 것. "결과"창 (포커스가 있는지 확인)을 클릭하고 ⌘ +를 누르면 사용 된 키 조합이 표시되고 "성공!"이라고 표시됩니다. 이하. 그렇지 않으면 키 조합 만 표시됩니다. 내 키보드에서 플러스 기호에 직접 액세스 할 수 있으므로 내가 보는 키 조합은 단지 "⌘ +"입니다. 그러나 더하기 기호를 입력하기 위해 이동이 필요한 경우 "⇧⌘ +"가 표시되어야합니다.

Safari/Mac에서 키보드 단축키를 처리하는 데 유용한 일반화 된 코드이므로 원하는 경우 빌드 할 수 있습니다. 블러 이벤트 등에서 수정 자 스택을 재설정하기 위해 몇 개의 이벤트 리스너를 추가해야합니다. 이상적으로, 수정 자 스택은 키를 놓을 때 자동으로 재설정되지만, 브라우저 나 관찰 된 요소/창/문서에서 포커스를 잃을 수 있으므로 키 업 이벤트가 처리되지 않고 해제 된 키가 승리합니다. 스택에서 제거 할 수 없습니다. 따라서 흐림 이벤트가 있는지 확인하십시오.

+0

먼저, ⌘ +를 납치 할 때주의 깊게 100 % 동의합니다. 내장 된 확대/축소 명령을 무시하고 사이트 당 확대/축소 수준을 리콜하는 플러그인이 있으므로이 경우에는 적절하다고 생각합니다. 둘째, 대답 해줘서 고마워. 나는 당신이 대답을 알아 내는데 필요한 모든 도구를 제공했다고 생각하지만, 나는이 정보를 받아 내 필요를 채울 수있는 하루가 걸릴 것입니다. –

+0

완벽하게 작동합니다 ... 감사합니다! jsfiddle 예를 약간 수정하면 exampleCallback 함수에서 '+'키 (U + 002B) 대신 '='키 (U + 003D)의 유니 코드를 사용할 수 있습니다. –

+0

@CeriMorgan : 아, 죄송합니다. jsfiddle을 모으고 자 할 때 질문을 잘못 읽었지만 ⌘ =가 아닌 ⌘ +를 듣고 싶습니다. 게시하기 전에 내 대답을 편집했지만 jsfiddle을 편집하는 것을 잊었습니다. 어쨌든; 위대한 다른 코드 작동 – Flambino

0

이벤트 객체를 창 객체 레벨 1 (예 : event = window.EE)에 등록한 다음 Firebug 또는 Safari의 웹 개발자 도구로 찾아보고 원하는 경우 트리거되는 값을 확인하십시오. 그래서 비교 대상을 알게 될 것입니다.

+0

두 경우 모두 (command shift = 및 command =) 전체 이벤트 객체를 비교했으며 그 결과는 전의 경우에 존재하는 shiftKey 수정 자의 존재와 완전히 동일하게 보입니다. 그러나 나는 shift =가 항상 +가 될 것이라는 가정을하고 싶지 않다. –

0

슬프게도 나는 대답이 없다고 생각합니다. 문제는 CMD+SHIFT+=의 경우 charCode을 누르면 43 (+)이 아닌 61 (=)이됩니다. 이것은 시스템 전체 디자인인데, 그 이유는 Mac OS X 자체가 CMD+SHIFT+==에 더하고 +COMMAND이 아닌 두 개의 수식어로 해석하기 때문입니다.

나는이 보여 함께 간단한 jsFiddle을 넣어 : 당신이 COMMAND +을 감지 할 경우 http://jsfiddle.net/ScuDj/1/

기본적으로, 당신은 키보드 레이아웃 처리 할 것입니다.

또는 숫자 키패드 + 만 지원할 수 있습니다. (농담 ;-)

(또한 : textInput 이벤트에 연결하려고 시도했지만 전역 적으로 등록 할 수 없었습니다. 나는 domNodes에서만 작동한다고 생각합니다. 나는 그 이벤트를 많이 사용하지 않았습니다.)