JQuery로 CTRL + S를 캡처하는 가장 좋은 브라우저 간 방법?


162

사용자가 Ctrl+ S를 눌러 양식을 저장하려고합니다. Ctrl+ S키 조합 을 캡처하고 양식을 제출 하는 브라우저 간 좋은 방법이 있습니까?

앱은 Drupal을 기반으로하기 때문에 jQuery를 사용할 수 있습니다.

답변:


121
$(window).keypress(function(event) {
    if (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) return true;
    alert("Ctrl-S pressed");
    event.preventDefault();
    return false;
});

키 코드는 브라우저마다 다를 수 있으므로 115 개 이상을 확인해야 할 수도 있습니다.


5
OS X 웹킷 브라우저에서 cmd + s는 19를 리턴하므로이를 확인할 가치가 있습니다. 즉, if (! (event.which == 115 && event.ctrlKey) &&! (event.which == 19)) true를 반환합니다.
Tadas T

6
Firefox에서만 작동합니다. IE9 및 Chrome은 키 누르기를 등록하지 않습니다.
펠름

7
IE와 Chrome은 $ (document) .keypress ($ (window) .keypress 대신)를 사용하더라도 스크립트가 수행하기 전에 여전히 'Ctrl'을 사용하여 키 누르기 이벤트를 가져옵니다.
펠름

16
크롬 keydown대신에 사용keypress
destan

3
불행히도 그것은 구식입니다
Cannicide

250

이것은 jquery를 사용하여 Ctrl+ S, Ctrl+ FCtrl+ 를 오버로드하는 데 효과적입니다 G.

$(window).bind('keydown', function(event) {
    if (event.ctrlKey || event.metaKey) {
        switch (String.fromCharCode(event.which).toLowerCase()) {
        case 's':
            event.preventDefault();
            alert('ctrl-s');
            break;
        case 'f':
            event.preventDefault();
            alert('ctrl-f');
            break;
        case 'g':
            event.preventDefault();
            alert('ctrl-g');
            break;
        }
    }
});

8
이 크롬 버전 28.0.1500.71 포함 내가 테스트 한 모든 브라우저에서 나를 위해 일한 유일한 대답이다
T. 브라이언 존스

27
순수 JS와 해 드리겠습니다 당신이 사용하는 경우 window.addEventListener(대신$(window).bind(

2
@NatesS 경고를 제거하면 저장 대화 상자가 열리지 않습니다. 경고로 인해 발생합니다. 모든 브라우저에서 잘 작동합니다. 좋은 해결 방법.
CrazyNooB

2
나를 위해 일했다. 위의 답변보다이 답변을 수락하십시오.
pavanw3b

1
@Fireflight : else if원래 if설명이 이미 true로 평가 되므로 a가 작동하지 않습니다 . 원본 if을으로 바꾸고 원본 문장 앞에 코드를 넣어야합니다 else if.
대니 루이 터스

34

바로 가기 라이브러리 를 사용하여 브라우저 별 항목을 처리 할 수 있습니다 .

shortcut.add("Ctrl+S",function() {
    alert("Hi there!");
});

7
이것은 jQuery 플러그인으로 변환되었고, 갈래 질 (forked and reforked) 1.6.x를 지원합니다 : github.com/ricardovaleriano/jquery.hotkeys
Félix Saparelli

12
동료 Google 직원의 경우 jQuery 플러그인의 업데이트 된 URL은 다음과 같습니다. github.com/jeresig/jquery.hotkeys
bgs264

29

이 jQuery 솔루션은 Chrome 및 Firefox에서 Ctrl+ SCmd+ 모두 작동합니다 S.

$(document).keydown(function(e) {

    var key = undefined;
    var possible = [ e.key, e.keyIdentifier, e.keyCode, e.which ];

    while (key === undefined && possible.length > 0)
    {
        key = possible.pop();
    }

    if (key && (key == '115' || key == '83' ) && (e.ctrlKey || e.metaKey) && !(e.altKey))
    {
        e.preventDefault();
        alert("Ctrl-s pressed");
        return false;
    }
    return true;
}); 

1
이것이 제대로 작동하는 유일한 솔루션입니다. 고마워요!
Stephan Weinhold

1
이것은 현재 구식 일 수도 있습니다 . e.key대신 사용 e.which;
Cannicide

최신 표준을 위해 2017 년 5 월 14 일에 업데이트되었습니다.
Alan Bellows

28

이것은 몇 가지 이유에 대한 ... 크롬에 나를 위해 일 event.which하지 않도록, 나를 위해 반환 자본 S (83) 왜 (에 관계없이 캡의 상태가 잠금) 내가 사용 그렇게 fromCharCode하고 toLowerCase단지 안전을 위해

$(document).keydown(function(event) {

    //19 for Mac Command+S
    if (!( String.fromCharCode(event.which).toLowerCase() == 's' && event.ctrlKey) && !(event.which == 19)) return true;

    alert("Ctrl-s pressed");

    event.preventDefault();
    return false;
});

누구든지 83이 아닌 115를 얻는 이유를 알고 있다면 , 기뻐할 것입니다. 다른 브라우저에서 이것을 테스트하면 작동하는지 아닌지 기뻐할 것입니다.


크롬에서도 이와 동일한 문제가 있습니다. 그런 고통!
qodeninja

ps 이제 그것을 보았으니 return false가 그것을 트리거하고 (그리고 stopPropagation) 그 값에 대해 중요한 것은 확실하지 않기 때문에 preventDefault가 중복 적이라고 생각합니다
Eran Medan

7

FireFox, IE 및 Chrome을 지원하기 위해 몇 가지 옵션을 결합했습니다. Mac을 더 잘 지원하도록 업데이트했습니다.

// simply disables save event for chrome
$(window).keypress(function (event) {
    if (!(event.which == 115 && (navigator.platform.match("Mac") ? event.metaKey : event.ctrlKey)) && !(event.which == 19)) return true;
    event.preventDefault();
    return false;
});

// used to process the cmd+s and ctrl+s events
$(document).keydown(function (event) {
     if (event.which == 83 && (navigator.platform.match("Mac") ? event.metaKey : event.ctrlKey)) {
        event.preventDefault();
        save(event);
        return false;
     }
});

5

웹 응용 프로그램이 기본 바로 가기 키를 정직하게 무시하지 않기를 바랍니다. Ctrl+ S이미 브라우저에서 무언가를합니다. 내가보고있는 사이트에 따라 갑자기 변경되는 것은 종종 버그가있는 것은 말할 것도없고 혼란스럽고 실망스러운 일입니다. 내가 사이트를 공중 납치 했어 Ctrl+ Tab이 같은 모습 때문에 Ctrl+ I두 사이트에 내 작품을 망치고 평소대로 탭을 전환에서 저를 방지.

바로 가기 키를 원하면 accesskey속성을 사용하십시오 . 기존 브라우저 기능을 중단하지 마십시오.


2
전적으로 동의하지만 안타깝게도 저는 의사 결정자가 아니라 구현하는 사람입니다.
ceejayoz

24
사실이지만 CTRL + S는 자주 사용되는 기능이 아닙니다. 특히 사람들이 webapp에 파일을 저장할 수 있다는 것을 의미한다면 사람들이 그것을 놓칠 것이라고 의심합니다.
멸종 위기에 처한

13
나는 일반적으로 당신과 동의,하지만 난 유일한 시간 이제까지 내가이 웹 애플리케이션을 사용하고 잊고 바로 가기 유용한 일을 할 것으로 예상 할 때 브라우저에서 CTRL-S를 사용입니다. 나는 보통 실망합니다. Gmail은 ctrl-s를 누르면 이메일을 저장하지만, 예상대로 작동하고 모든 데스크톱 앱이 수행하는 작업을 수행 할 때 실제로 인식하지 못하기 때문에 눈치 채지 못할 것입니다. Gmail을 HTML로 저장하려고한다고 생각하면 성가시다.
카슨 마이어스

4
이것은 실제로 응용 프로그램에 따라 다릅니다. 터미널 에뮬레이터 웹 앱을 만들고 있는데 Ctrl + C를 재정의하는 것이 필요하지 않은 경우 실용적입니다.
Brack

실제로 HTML 페이지를 저장해야 할 필요성은 상당히 적습니다. 그러나 다른 사람들이 말했듯이, 브라우저는 우리가 일하는 곳으로 빠르게 변하고 있으며, 모든 일을하고 있으며 점점 더 많은 브라우저가 워드 프로세서와 전통적으로 데스크탑에서 사용되는 다른 앱을 대신하고 있습니다. 사용자는 키보드에 익숙합니다. 바로 가기를 지원하므로 유용성과 채택을 위해 필수 요소입니다. 워드 프로세서를 만들어 ALT + SHIFT + S 또는 더 나쁜 결과를 얻으면 사용자에게 나쁜 습관처럼 앱을 덤프합니다.
DavidScherer

4

@Eevee : 브라우저가 더 풍부하고 풍부한 기능의 홈이되어 데스크탑 앱을 대체하기 시작하면서 키보드 단축키 사용을 포기할 수있는 옵션은 아닙니다. Gmail의 풍부하고 직관적 인 키보드 명령은 Outlook을 기꺼이 포기하는 데 중요한 역할을했습니다. Todoist, Google Reader 및 Google 캘린더의 키보드 단축키는 모두 일상 생활을 훨씬 쉽게 만들어줍니다.

개발자는 브라우저에서 이미 의미가있는 키 입력을 무시하지 않도록주의해야합니다. 예를 들어, 입력하고있는 WMD 텍스트 상자는 Ctrl+ Del를 "단어 앞으로 삭제"가 아니라 "Blockquote"로 해석 할 수 없습니다 . 사이트 개발자가 사용할 수있는 "브라우저 안전"바로 가기의 표준 목록이 있고 브라우저가 향후 버전에서 벗어나지 않겠다고 궁금합니다.


1
대답은 아니요입니다. 브라우저에 안전한 바로 가기 목록은 없습니다. 그리고 그것은 두 가지 resaons에 좋습니다 : 1. 바로 가기는 사용자 정의 할 수 있습니다 (적어도 Opera에서). 2. 이렇게하면 브라우저 공급 업체의 창의력을 제한하여 브라우저 사용 자체에 더 많은 권한을 부여하지 않습니다.
기즈모

3

$(document).keydown(function(e) {
    if ((e.key == 's' || e.key == 'S' ) && (e.ctrlKey || e.metaKey))
    {
        e.preventDefault();
        alert("Ctrl-s pressed");
        return false;
    }
    return true;
}); 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Try pressing ctrl+s somewhere.

이것은 @AlanBellows의 최신 답변으로 대체 which됩니다 key. Chrome의 자본 키 결함에서도 작동합니다 ( Ctrl+ 를 누르면 Ss 대신 자본 S를 보냅니다). 모든 최신 브라우저에서 작동합니다.


이를 테스트하려면 스 니펫 상자 내부를 클릭하고 Ctrl + S를 누르십시오.
Cannicide

1

이것은 내 솔루션으로 다른 제안보다 훨씬 읽기 쉽고 다른 키 조합을 쉽게 포함 할 수 있으며 IE, Chrome 및 Firefox에서 테스트되었습니다.

$(window).keydown(function(evt) {
    var key = String.fromCharCode(evt.keyCode);
    //ctrl+s
    if (key.toLowerCase() === "s" && evt.ctrlKey) {
        fnToRun();
        evt.preventDefault(true);
        return false;
    }
    return true;
});

1
의 사용에 대한 일 String.fromCharCode. 그러나 Mac에는 제어 키가 없습니다. 로 명령 키를 테스트하십시오 evt.metaKey. trueMac에서는 Cmd, Windows에서는 Win로 돌아갑니다 .
카토 펫


0

이것은 작동해야합니다 ( https://stackoverflow.com/a/8285722/388902 에서 적응 ).

var ctrl_down = false;
var ctrl_key = 17;
var s_key = 83;

$(document).keydown(function(e) {
    if (e.keyCode == ctrl_key) ctrl_down = true;
}).keyup(function(e) {
    if (e.keyCode == ctrl_key) ctrl_down = false;
});

$(document).keydown(function(e) {
    if (ctrl_down && (e.keyCode == s_key)) {
        alert('Ctrl-s pressed');
        // Your code
        return false;
    }
}); 


0

Alan Bellows에게 답변 :! (e.altKey)는 AltGr입력 할 때 사용하는 사용자 (예 : 폴란드) 를 위해 추가되었습니다 . 이 누르지 않고 AltGr+는 S같은 결과를 줄 것이다 Ctrl+를S

$(document).keydown(function(e) {
if ((e.which == '115' || e.which == '83' ) && (e.ctrlKey || e.metaKey) && !(e.altKey))
{
    e.preventDefault();
    alert("Ctrl-s pressed");
    return false;
}
return true; });

0

내가 만든이 플러그인이 도움이 될 수 있습니다.

플러그인

이 플러그인을 사용하면 키 코드와 기능을 제공하여 다음과 같이 실행할 수 있습니다

simulatorControl([17,83], function(){
 console.log('You have pressed Ctrl+Z');
});

코드에서 Ctrl+ 를 수행하는 방법을 표시했습니다 S. 링크에 자세한 문서가 제공됩니다. 플러그인은 Codepen에서 내 펜의 JavaScript 코드 섹션에 있습니다.


0

기본 동작을 방지하기 위해를 사용하여 IE 에서 내 문제를 해결했습니다 alert("With a message").

window.addEventListener("keydown", function (e) {
    if(e.ctrlKey || e.metaKey){
        e.preventDefault(); //Good browsers
        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { //hack for ie
            alert("Please, use the print button located on the top bar");
            return;
        }
    }
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.