Melhor método entre navegadores para capturar CTRL + S com JQuery?

162

Meus usuários gostariam de pressionar Ctrl+ Spara salvar um formulário. Existe uma boa maneira entre navegadores de capturar a combinação de teclas Ctrl+ Se enviar meu formulário?

O aplicativo é construído no Drupal, então o jQuery está disponível.

ceejayoz
fonte

Respostas:

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

Os códigos de chave podem diferir entre os navegadores; portanto, talvez seja necessário verificar mais do que apenas 115.

Jim
fonte
5
nos navegadores OS X webkit, o cmd + s retorna 19, então também vale a pena verificar isso. ou seja, se (! (event.which == 115 && event.ctrlKey) &&! (event.which == 19)) retornar true;
Tadas T
6
Só funciona no Firefox para mim. O IE9 e o Chrome não registram nenhum pressionamento de tecla.
pelms
7
Mesmo com $ (document) .keypress (em vez de $ (window) .keypress), o IE e o Chrome ainda capturam o evento de pressionamento de tecla com 'Ctrl' antes do script.
pelms
16
usar keydown, em vez de keypressem cromo
destan
3
Infelizmente, está desatualizado
Cannicide
250

Isso funciona para mim (usando jquery) para sobrecarregar Ctrl+ S, Ctrl+ Fe Ctrl+ 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;
        }
    }
});
Danny Ruijters
fonte
8
Esta é a única resposta que funcionou para mim em todos os navegadores que eu testei, incluindo Chrome versão 28.0.1500.71
T. Brian Jones
27
Factível com pura JS se você usar window.addEventListener(em vez de$(window).bind(
2
@NatesS se você remover o alerta, ele não abrirá a caixa de diálogo Salvar. É causado devido ao alerta. Funciona bem para mim em todos os navegadores. Solução agradável.
CrazyNooB 08/04
2
Trabalhou para mim. Aceite esta resposta em vez da resposta acima.
Pavanw3b
1
@ FlightFlight: um else ifnão funcionará porque a ifdeclaração original já será avaliada como verdadeira. Você terá que colocar seu código antes da ifdeclaração original , transformando o original em um else if.
Danny Ruijters 11/07/19
29

Esta solução jQuery funciona para mim no Chrome e Firefox, tanto para Ctrl+ Scomo para Cmd+ 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;
}); 
Alan Bellows
fonte
1
Esta é a única solução que está funcionando corretamente aqui. Muito obrigado!
23815 Stephan Weinhold
1
isso pode estar desatualizado agora: use em e.keyvez de e.which;
Cannicide
Atualizado 14 de maio de 2017 para os padrões modernos.
Alan Bellows
28

Este funcionou para mim no Chrome ... por algum motivo, event.whichretorna um S maiúsculo (83) para mim, não sei por que (independentemente do estado do caps lock), então eu usei fromCharCodee toLowerCaseapenas para estar do lado seguro

$(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;
});

Se alguém souber por que eu recebo 83 e não 115 , ficarei feliz em ouvir, também se alguém testar isso em outros navegadores, ficarei feliz em saber se funciona ou não

Eran Medan
fonte
Eu tenho esse mesmo problema com o chrome. Que dor!
Qodeninja 23/01
ps agora que eu olhar para ele, eu acho que o preventDefault é redundante como retorno falsos gatilhos (e stopPropagation), mas não tenho certeza que importa muito para a questão
Eran Medan
7

Combinei algumas opções para oferecer suporte ao FireFox, IE e Chrome. Também atualizei-o para melhor suporte ao 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;
     }
});
uadrive
fonte
5

Gostaria que os aplicativos da Web não substituíssem minhas teclas de atalho padrão, honestamente. Ctrl+ Sjá faz algo nos navegadores. Ter essa alteração abruptamente, dependendo do site que estou visualizando, é perturbador e frustrante, sem mencionar muitas vezes erros. Eu tive sites seqüestrados Ctrl+ Tabporque parecia o mesmo que Ctrl+ I, arruinando meu trabalho no site e me impedindo de alternar entre as guias como de costume.

Se você deseja teclas de atalho, use o accesskeyatributo Por favor, não quebre a funcionalidade existente do navegador.

Eevee
fonte
2
Concordo inteiramente, mas infelizmente sou o peon implementador, não o tomador de decisão.
ceejayoz
24
É verdade, mas CTRL + S não é um recurso usado com frequência. Duvido que as pessoas sentiriam falta, especialmente se isso significa que você pode salvar seu arquivo no seu aplicativo da web.
EndangeredMassa
13
Normalmente eu concordo com você, mas a única vez que eu nunca use Ctrl-s em um navegador é quando eu esqueço que estou usando uma aplicação web e esperar que o atalho para fazer algo útil. Eu normalmente estou decepcionado. O Gmail salva seu e-mail quando você pressiona as teclas Ctrl-s, embora você nunca perceba, porque quando ele faz o que você espera e o que todo aplicativo de desktop faz, você realmente não percebe. Você percebe quando pensa que deseja salvar o Gmail como HTML, e isso é irritante.
Carson Myers
4
Isso realmente depende da aplicação. Estou construindo um aplicativo Web de emulador de terminal e substituir Ctrl + C parece prático, se não for necessário.
Brack
A necessidade de realmente salvar uma página HTML é bastante pequena, eu me pego fazendo isso nunca. No entanto, como já foi dito, o navegador está rapidamente se tornando o local onde trabalhamos, todo o nosso trabalho, e cada vez mais navegadores estão substituindo os processadores de texto e outros aplicativos tradicionalmente usados ​​na área de trabalho, os usuários estão acostumados ao teclado atalhos, portanto, apoiá-los é essencial para a usabilidade e adoção. Se você criar um processador de texto e me fizer pressionar ALT + SHIFT + S ou algo pior, vou despejar seu aplicativo como um mau hábito como usuário.
DavidScherer
4

@ Eevee: À medida que o navegador se torna o lar de funcionalidades cada vez mais ricas e começa a substituir os aplicativos de desktop, não será apenas uma opção para renunciar ao uso de atalhos de teclado. O conjunto rico e intuitivo de comandos do teclado do Gmail foi fundamental na minha disposição de abandonar o Outlook. Os atalhos de teclado do Todoist, Google Reader e Google Calendar tornam minha vida muito, muito mais fácil diariamente.

Definitivamente, os desenvolvedores devem tomar cuidado para não substituir as teclas digitadas que já possuem um significado no navegador. Por exemplo, a caixa de texto WMD que estou digitando inexplicavelmente interpreta Ctrl+ Delcomo "Blockquote" em vez de "excluir a palavra adiante". Estou curioso para saber se há uma lista padrão em algum lugar de atalhos "seguros para o navegador" que os desenvolvedores de sites podem usar e que os navegadores se comprometam a ficar longe de versões futuras.

Caudill de ervas
fonte
1
A resposta é Não, não existe uma lista segura de atalhos seguros para o navegador. E é bom para duas versões: 1. O atalho é personalizável (pelo menos no Opera). 2. Ao fazer isso, você não restringe a criatividade dos fornecedores de navegadores para fornecer mais poder para o próprio uso do navegador.
Gizmo
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.

Esta é uma versão atualizada da resposta de @ AlanBellows, substituindo whichpor key. Ele também funciona mesmo com a falha da tecla de capital do Chrome (onde, se você pressionar Ctrl+, Sele envia capital S em vez de s). Funciona em todos os navegadores modernos.

Cannicide
fonte
Para testar isso, clique dentro da caixa de snippet e pressione Ctrl + S.
Cannicide
1

Esta foi a minha solução, que é muito mais fácil de ler do que outras sugestões aqui, pode incluir facilmente outras combinações de teclas e foi testada no IE, Chrome e 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;
});
R. Salisbury
fonte
1
+1 para o uso de String.fromCharCode. Embora os Macs não tenham uma chave de controle. Teste a chave de comando com evt.metaKey. Ele retorna truepara Cmd no Mac e Win no Windows.
KatoFett 30/06
1

Eu gosto deste pequeno plugin . No entanto, ele precisa de um pouco mais de compatibilidade entre navegadores.

misteraidan
fonte
0

Isso deve funcionar (adaptado de 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;
    }
}); 
peles
fonte
0

Para Alan Bellows, responda:! (E.altKey) adicionado para usuários que usam AltGrao digitar (por exemplo, Polônia). Sem isso, pressionar AltGr+ Sdará o mesmo resultado que 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; });
Jaś Fasola
fonte
0

Este plugin criado por mim pode ser útil.

Plugar

Você pode usar este plugin. Você precisa fornecer os códigos-chave e a função a ser executada dessa maneira

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

No código, eu mostrei como executar o Ctrl+ S. Você receberá a documentação detalhada no link. O plug-in está na seção Código JavaScript da minha caneta no Codepen.

10011101111
fonte
0

Resolvi meu problema no IE , usando um alert("With a message")para impedir o comportamento padrão:

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;
        }
    }
});
user2570311
fonte