Meilleure méthode multi-navigateurs pour capturer CTRL + S avec JQuery?

162

Mes utilisateurs aimeraient pouvoir appuyer sur Ctrl+ Spour enregistrer un formulaire. Existe-t-il un bon moyen pour plusieurs navigateurs de capturer la combinaison de touches Ctrl+ Set d'envoyer mon formulaire?

L'application est basée sur Drupal, donc jQuery est disponible.

ceejayoz
la source

Réponses:

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

Les codes clés peuvent différer d'un navigateur à l'autre, vous devrez donc peut-être en rechercher plus de 115.

Jim
la source
5
sur les navigateurs Webkit OS X cmd + s renvoie 19, il vaut donc la peine de vérifier cela. ie if (! (event.which == 115 && event.ctrlKey) &&! (event.which == 19)) retourne vrai;
Tadas T
6
Fonctionne uniquement dans Firefox pour moi. IE9 et Chrome n'enregistrent aucune pression de touche.
pelms
7
Même avec $ (document) .keypress (au lieu de $ (window) .keypress), IE et Chrome saisissent toujours l'événement keypress avec 'Ctrl' avant le script.
pelms
16
utiliser keydownau lieu de keypressdans chrome
destan
3
Malheureusement, il est obsolète
Cannicide
250

Cela fonctionne pour moi (en utilisant jquery) pour surcharger Ctrl+ S, Ctrl+ Fet 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
la source
8
C'est la seule réponse qui a fonctionné pour moi dans tous les navigateurs que j'ai testés, y compris Chrome Version 28.0.1500.71
T. Brian Jones
27
Faisable avec pur JS si vous utilisez à la window.addEventListener(place de$(window).bind(
2
@NatesS si vous supprimez l'alerte, cela n'ouvre pas la boîte de dialogue d'enregistrement. Cela est dû à une alerte. Fonctionne bien pour moi dans tous les navigateurs. Belle solution de contournement.
CrazyNooB
2
A travaillé pour moi. Veuillez accepter cette réponse plutôt que celle ci-dessus.
pavanw3b
1
@Fireflight: an else ifne fonctionnera pas car la ifdéclaration d' origine sera déjà évaluée comme vraie. Vous devrez mettre votre code avant l' ifinstruction d' origine , en transformant l'original en un fichier else if.
Danny Ruijters du
29

Cette solution jQuery fonctionne pour moi dans Chrome et Firefox, à la fois pour Ctrl+ Set 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
la source
1
C'est la seule solution qui fonctionne correctement ici. Merci beaucoup!
Stephan Weinhold
1
cela pourrait être obsolète maintenant: utilisez e.keyau lieu de e.which;
Cannicide
Mis à jour le 14 mai 2017 pour les normes modernes.
Alan Bellows
28

Celui-ci a fonctionné pour moi sur Chrome ... pour une raison quelconque, event.whichrenvoie un S majuscule (83) pour moi, je ne sais pas pourquoi (quel que soit l'état du verrouillage des majuscules), alors j'ai utilisé fromCharCodeet toLowerCasejuste pour être du bon côté

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

Si quelqu'un sait pourquoi j'obtiens 83 et non 115 , je serai heureux d'entendre, même si quelqu'un teste cela sur d'autres navigateurs, je serai heureux de savoir si cela fonctionne ou non

Eran Medan
la source
J'ai ce même problème avec le chrome. Une telle douleur!
qodeninja
ps maintenant que je le regarde, je pense que le preventDefault est redondant car return false le déclenche (et stopPropagation) mais pas sûr que cela compte beaucoup pour la question
Eran Medan
7

J'ai combiné quelques options pour prendre en charge FireFox, IE et Chrome. Je l'ai également mis à jour pour mieux supporter 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
la source
5

J'aimerais que les applications Web ne remplacent pas mes touches de raccourci par défaut, honnêtement. Ctrl+ fait Sdéjà quelque chose dans les navigateurs. Avoir ce changement brusquement en fonction du site que je consulte est perturbant et frustrant, sans parler de souvent bogué. J'ai eu des sites détournés Ctrl+ Tabparce qu'il ressemblait à Ctrl+ I, à la fois ruinant mon travail sur le site et m'empêchant de changer d'onglet comme d'habitude.

Si vous voulez des touches de raccourci, utilisez l' accesskeyattribut. Veuillez ne pas interrompre les fonctionnalités existantes du navigateur.

Évoli
la source
2
Je suis entièrement d'accord, mais malheureusement, je suis celui qui met en œuvre, pas le décideur.
ceejayoz
24
C'est vrai, mais CTRL + S n'est pas une fonctionnalité souvent utilisée. Je doute que les gens le rateraient, surtout si cela signifie que vous pouvez enregistrer votre fichier dans votre application Web.
EndangeredMassa
13
Je suis d' accord avec vous normalement, mais la seule fois que je jamais utiliser Ctrl-s dans un navigateur est quand j'oublie que je suis sur un webapp et attends le raccourci pour faire quelque chose d' utile. Je suis normalement déçu. Gmail enregistre votre e-mail lorsque vous appuyez sur Ctrl-s, bien que vous ne le remarquiez jamais, car lorsqu'il fait exactement ce que vous attendez et ce que fait chaque application de bureau, vous ne le remarquez pas vraiment. Vous remarquez quand il pense que vous voulez enregistrer Gmail au format HTML, et c'est ennuyeux.
Carson Myers
4
Cela dépend vraiment de l'application. Je construis une application Web d'émulateur de terminal et le remplacement de ctrl + c semble pratique, sinon nécessaire.
Brack
Le besoin de sauvegarder une page HTML est assez mince, je me retrouve à ne jamais le faire. Cependant, comme d'autres l'ont dit, le navigateur devient rapidement l'endroit où nous travaillons, tout notre travail, et de plus en plus de navigateurs remplacent les traitements de texte et autres applications traditionnellement utilisées sur le bureau, les utilisateurs sont habitués à leur clavier raccourcis, donc les soutenir est un must pour la convivialité et l'adoption. Si vous créez un traitement de texte et que vous me faites appuyer sur ALT + SHIFT + S ou quelque chose de pire, je vais vider votre application comme une mauvaise habitude en tant qu'utilisateur.
DavidScherer
4

@Eevee: Alors que le navigateur devient le foyer de fonctionnalités plus riches et plus riches et commence à remplacer les applications de bureau, ce ne sera tout simplement pas une option pour renoncer à l'utilisation des raccourcis clavier. L'ensemble riche et intuitif de commandes clavier de Gmail a contribué à ma volonté d'abandonner Outlook. Les raccourcis clavier de Todoist, Google Reader et Google Agenda me facilitent beaucoup la vie au quotidien.

Les développeurs doivent absolument veiller à ne pas remplacer les frappes qui ont déjà une signification dans le navigateur. Par exemple, la zone de texte WMD dans laquelle je tape interprète inexplicablement Ctrl+ Delcomme "Blockquote" plutôt que "delete word forward". Je suis curieux de savoir s'il existe quelque part une liste standard de raccourcis «sûrs pour le navigateur» que les développeurs de sites peuvent utiliser et que les navigateurs s'engageront à éviter dans les versions futures.

Herbe Caudill
la source
1
La réponse est non, il n'y a pas de liste sûre de raccourcis sécurisés pour le navigateur. Et c'est bon pour deux resaons: 1. Les raccourcis sont personnalisables (au moins dans Opera). 2. Ce faisant, vous ne limitez pas la créativité des fournisseurs de navigateurs pour vous donner plus de puissance pour l'utilisation du navigateur lui-même.
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.

Ceci est une version à jour de la réponse de @ AlanBellows, remplacée whichpar key. Cela fonctionne également même avec le pépin de touche majuscule de Chrome (où si vous appuyez sur Ctrl+, Sil envoie un S majuscule au lieu de s). Fonctionne dans tous les navigateurs modernes.

Cannicide
la source
Pour tester cela, cliquez à l'intérieur de la zone d'extrait de code et appuyez sur Ctrl + S.
Cannicide
1

C'était ma solution, qui est beaucoup plus facile à lire que d'autres suggestions ici, peut facilement inclure d'autres combinaisons de touches et a été testée sur IE, Chrome et 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
la source
1
+1 pour l'utilisation de String.fromCharCode. Cependant, les Mac n'ont pas de clé de contrôle. Testez la touche de commande avec evt.metaKey. Il revient truepour Cmd sur Mac et Win sur Windows.
KatoFett
1

J'aime ce petit plugin . Il faut cependant un peu plus de convivialité entre les navigateurs.

misteraidan
la source
0

Cela devrait fonctionner (adapté 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;
    }
}); 
pelms
la source
0

À Alan Bellows réponse:! (E.altKey) ajouté pour les utilisateurs qui utilisent AltGrlors de la frappe (par exemple, la Pologne). Sans cette pression, AltGr+ Sdonnera le même résultat 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
la source
0

Ce plugin créé par moi peut être utile.

Brancher

Vous pouvez utiliser ce plugin, vous devez fournir les codes clés et la fonction à exécuter comme ceci

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

Dans le code, j'ai montré comment effectuer pour Ctrl+ S. Vous obtiendrez une documentation détaillée sur le lien. Le plugin est dans la section Code JavaScript de mon stylo sur Codepen.

10011101111
la source
0

J'ai résolu mon problème sur IE , en utilisant un alert("With a message")pour empêcher le comportement par défaut:

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
la source