Metode lintas-browser terbaik untuk menangkap CTRL + S dengan JQuery?

162

Pengguna saya ingin dapat menekan Ctrl+ Suntuk menyimpan formulir. Apakah ada cara lintas-browser yang baik untuk menangkap kombinasi tombol Ctrl+ Sdan mengirimkan formulir saya?

Aplikasi dibangun di atas Drupal, jadi jQuery tersedia.

ceejayoz
sumber

Jawaban:

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

Kode kunci dapat berbeda di antara browser, jadi Anda mungkin perlu memeriksa lebih dari 115.

Jim
sumber
5
pada OS X, webkit browser cmd + s mengembalikan 19, jadi perlu juga untuk memeriksa itu. yaitu if (! (event.which == 115 && event.ctrlKey) &&! (event.which == 19)) mengembalikan true;
Tadas T
6
Hanya berfungsi di Firefox untuk saya. IE9 & Chrome tidak mendaftarkan penekanan tombol apa pun.
Pelms
7
Bahkan dengan $ (dokumen) .keypress (bukan $ (window) .keypress), IE dan Chrome masih mengambil acara penekanan tombol dengan 'Ctrl' sebelum skrip melakukannya.
Pelms
16
gunakan keydownsebagai ganti keypressdi chrome
destan
3
Sayangnya sudah ketinggalan zaman
Cannicide
250

Ini berfungsi untuk saya (menggunakan jquery) untuk membebani Ctrl+ S, Ctrl+ Fdan 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
sumber
8
Ini adalah satu-satunya jawaban yang bekerja untuk saya di semua browser yang saya uji, termasuk Chrome Versi 28.0.1500.71
T. Brian Jones
27
Dapat dilakukan dengan JS murni jika Anda menggunakan window.addEventListener(sebagai ganti$(window).bind(
2
@NatesS jika Anda menghapus peringatan itu tidak membuka dialog save. Ini disebabkan karena waspada. Bekerja dengan baik untuk saya di semua browser. Penanganan yang bagus.
CrazyNooB
2
Bekerja untukku. Mohon terima jawaban ini dari yang di atas.
pavanw3b
1
@ Fireflight: sebuah else iftidak akan berfungsi karena ifpernyataan asli sudah akan dievaluasi sebagai benar. Anda harus meletakkan kode Anda sebelum ifpernyataan asli , mengubah aslinya menjadi else if.
Danny Ruijters
29

Solusi jQuery ini berfungsi untuk saya di Chrome dan Firefox, untuk Ctrl+ Sdan 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
sumber
1
Ini adalah satu-satunya solusi yang berfungsi dengan baik di sini. Terima kasih banyak!
Stephan Weinhold
1
ini mungkin sudah ketinggalan zaman sekarang: gunakan e.keyalih-alih e.which;
Cannicide
Diperbarui 14 Mei 2017 untuk standar modern.
Alan Bellows
28

Yang ini bekerja untuk saya di Chrome ... untuk beberapa alasan event.whichmengembalikan huruf kapital S (83) untuk saya, tidak yakin mengapa (terlepas dari status caps lock) jadi saya menggunakan fromCharCodedan toLowerCasehanya untuk berada di sisi yang aman

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

Jika ada yang tahu mengapa saya mendapatkan 83 dan tidak 115 , saya akan senang mendengar, juga jika ada yang menguji ini di browser lain saya akan senang mendengar apakah itu berfungsi atau tidak

Eran Medan
sumber
Saya punya masalah yang sama dengan chrome. Sakit sekali!
qodeninja
ps sekarang setelah saya melihatnya, saya pikir bahwa preventDefault adalah redundan karena return false memicunya (Dan stopPropagation) tetapi tidak yakin itu sangat berarti untuk pertanyaan
Eran Medan
7

Saya menggabungkan beberapa opsi untuk mendukung FireFox, IE dan Chrome. Saya juga memperbaruinya untuk dukungan mac yang lebih baik

// 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
sumber
5

Saya ingin aplikasi Web tidak menimpa kunci pintas default saya, jujur. Ctrl+ Ssudah melakukan sesuatu di browser. Memiliki perubahan itu tiba-tiba tergantung pada situs yang saya lihat mengganggu dan membuat frustrasi, belum lagi sering buggy. Saya memiliki situs yang dibajak Ctrl+ Tabkarena tampilannya sama dengan Ctrl+ I, keduanya merusak pekerjaan saya di situs dan mencegah saya beralih tab seperti biasa.

Jika Anda ingin tombol pintas, gunakan accesskeyatribut. Tolong jangan hancurkan fungsionalitas browser yang ada.

Eevee
sumber
2
Saya setuju sepenuhnya, tapi sayangnya saya orang yang melaksanakan, bukan pembuat keputusan.
ceejayoz
24
Benar, tetapi CTRL + S bukanlah fitur yang sering digunakan. Saya ragu orang akan melewatkannya, terutama jika itu berarti Anda dapat menyimpan file Anda di webapp Anda.
EndangeredMassa
13
Saya biasanya setuju dengan Anda, tapi satu-satunya waktu saya pernah menggunakan ctrl-s di browser adalah ketika saya lupa saya menggunakan webapp dan mengharapkan jalan pintas untuk melakukan sesuatu yang berguna. Saya biasanya kecewa. Gmail menyimpan email Anda ketika Anda menekan ctrl-s, meskipun Anda tidak akan pernah melihat karena ketika itu hanya melakukan apa yang Anda harapkan, dan apa yang dilakukan setiap aplikasi desktop, Anda tidak benar-benar memperhatikan. Anda MELAKUKAN pemberitahuan ketika Anda berpikir ingin menyimpan gmail sebagai HTML, dan itu menjengkelkan.
Carson Myers
4
Ini sangat tergantung pada aplikasinya. Saya sedang membangun aplikasi web terminal emulator dan mengganti ctrl + c tampaknya praktis jika tidak perlu.
Brack
Kebutuhan untuk benar-benar menyimpan halaman HTML cukup ramping, saya menemukan diri saya melakukan ini tidak pernah. Namun seperti yang dikatakan orang lain, browser dengan cepat menjadi tempat di mana kita melakukan pekerjaan, semua pekerjaan kita, dan semakin banyak browser menggantikan pengolah kata dan aplikasi lain yang biasanya digunakan pada desktop, pengguna terbiasa dengan keyboard mereka. pintas, sehingga mendukung mereka adalah suatu keharusan bagi kegunaan dan adopsi. Jika Anda membuat pengolah kata dan membuat saya menekan ALT + SHIFT + S atau sesuatu yang lebih buruk, saya akan membuang aplikasi Anda seperti kebiasaan buruk sebagai pengguna.
DavidScherer
4

@Eevee: Karena peramban menjadi rumah bagi fungsionalitas yang lebih kaya dan lebih kaya dan mulai mengganti aplikasi desktop, itu tidak akan menjadi pilihan untuk tidak menggunakan pintasan keyboard. Rangkaian perintah keyboard yang kaya dan intuitif dari Gmail sangat membantu dalam kesediaan saya untuk meninggalkan Outlook. Pintasan keyboard di Todoist, Google Reader, dan Google Calendar semuanya membuat hidup saya jauh lebih mudah setiap hari.

Pengembang harus berhati-hati untuk tidak mengabaikan penekanan tombol yang sudah memiliki arti di browser. Sebagai contoh, kotak teks WMD yang saya ketikkan ke dalam interpretasi yang tidak dapat dijelaskan Ctrl+ Delsebagai "Blockquote" daripada "delete word forward". Saya ingin tahu apakah ada daftar standar cara pintas "aman-peramban" yang dapat digunakan pengembang situs dan bahwa peramban akan berkomitmen untuk menjauh dari versi yang akan datang.

Ramuan Caudill
sumber
1
Jawabannya adalah Tidak, tidak ada daftar jalan pintas yang aman dari browser. Dan itu bagus untuk dua resaons: 1. Shortcut dapat disesuaikan (setidaknya di Opera). 2. Dengan melakukan itu, Anda tidak membatasi kreativitas vendor browser untuk memberi Anda lebih banyak kekuatan untuk penggunaan browser itu sendiri.
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.

Ini adalah versi terbaru dari jawaban @ AlanBellows, yang diganti whichdengan key. Itu juga berfungsi bahkan dengan kesalahan kunci huruf besar Chrome (di mana jika Anda menekan Ctrl+ Situ mengirim huruf kapital S bukannya s). Bekerja di semua browser modern.

Cannicide
sumber
Untuk mengujinya, klik di dalam kotak cuplikan dan tekan Ctrl + S.
Cannicide
1

Ini adalah solusi saya, yang jauh lebih mudah dibaca daripada saran lain di sini, dapat dengan mudah memasukkan kombinasi tombol lainnya, dan telah diuji pada IE, Chrome, dan 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
sumber
1
+1 untuk penggunaan String.fromCharCode. Meskipun, Mac tidak memiliki kunci kontrol. Uji kunci perintah dengan evt.metaKey. Ia kembali trueuntuk Cmd pada Mac dan Menang di Windows.
KatoFett
0

Ini harus berfungsi (diadaptasi dari 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
sumber
0

Untuk jawaban Alan Bellows:! (E.altKey) ditambahkan untuk pengguna yang menggunakan AltGrsaat mengetik (mis. Polandia). Tanpa menekan AltGr+ ini Sakan memberikan hasil yang sama dengan 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
sumber
0

Plugin ini Dibuat oleh saya semoga bermanfaat.

Plugin

Anda dapat menggunakan plugin ini Anda harus menyediakan Kode kunci dan fungsinya untuk dijalankan seperti ini

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

Dalam kode, saya telah menampilkan cara melakukan untuk Ctrl+ S. Anda akan mendapatkan Dokumentasi Lengkap di tautan tersebut. Plugin ada di bagian Kode JavaScript Pena saya di Codepen.

10011101111
sumber
0

Saya memecahkan masalah saya di IE , menggunakan alert("With a message")untuk mencegah Perilaku default:

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;
        }
    }
});
pengguna2570311
sumber