JQuery ile CTRL + S yakalamak için en iyi çapraz tarayıcı yöntemi?


162

Kullanıcılarım bir formu kaydetmek için Ctrl+ Stuşuna basmak istiyor. Ctrl+ STuş kombinasyonunu yakalayıp formumu göndermenin iyi bir tarayıcılar arası yolu var mı?

Uygulama Drupal üzerine inşa edilmiştir, bu nedenle jQuery mevcuttur.

Yanıtlar:


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

Anahtar kodları tarayıcılar arasında farklılık gösterebilir, bu nedenle 115'den fazla olup olmadığını kontrol etmeniz gerekebilir.


5
OS X webkit tarayıcılarında cmd + s 19 döndürür, bu yüzden de kontrol etmeye değer. yani (! (event.which == 115 && event.ctrlKey) &&! (event.which == 19)) true değerini döndürürse;
Tadas T

6
Sadece benim için Firefox'ta çalışıyor. IE9 ve Chrome herhangi bir tuşa basılmaz.
Pelms

7
IE ve Chrome $ (document) .keypress ($ (window) .keypress yerine) ile bile olsa, komut dosyası yapmadan önce IE ve Chrome 'Ctrl' ile keypress olayını almaya devam eder.
Pelms

16
krom keydownyerine kullanmakkeypress
destan

3
Maalesef güncel değil
Cannicide

250

Bana (kullanarak jquery) için aşırı yük için bu eserler Ctrl+ S, Ctrl+ Fve 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;
        }
    }
});

8
Chrome Sürüm 28.0.1500.71
T. Brian Jones

27
Saf JS ile yapılabilir kullanırsanız window.addEventListener(yerine$(window).bind(

2
@NatesS uyarıyı kaldırırsanız kaydet iletişim kutusu açılmaz. Uyarı nedeniyle oluşur. Tüm tarayıcılarda benim için iyi çalışıyor. Güzel bir çözüm.
CrazyNooB

2
Benim için çalıştı. Lütfen bu cevabı yukarıdakinden daha kabul edin.
pavanw3b

1
@Fireflight: else iforijinal ifdeyim zaten doğru olarak değerlendirileceğinden bir çalışmaz. Kodunuzu orijinal ififadeden önce, orijinali bir else if.
Danny Ruijters


29

Bu jQuery çözüm her ikisi için, Chrome ve Firefox'ta benim için çalışıyor Ctrl+ Sve 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;
}); 

1
Burada düzgün çalışan tek çözüm budur. Çok teşekkürler!
Stephan Weinhold

1
bu artık güncel olmayabilir: e.keybunun yerine kullanın e.which;
Cannicide

Modern standartlar için 14 Mayıs 2017'de güncellendi.
Alan Bellows

28

Bu benim için Chrome'da çalıştı ... bazı nedenlerden dolayı benim için event.whichbüyük bir S (83) döndürüyor, neden olduğundan emin değilim (büyük harf kilidi durumuna bakılmaksızın) bu yüzden kullandım fromCharCodeve toLowerCasesadece güvenli tarafta olmak

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

Biri neden 115 değil 83 aldığımı bilirse , duymaktan memnuniyet duyarım, eğer birisi bunu diğer tarayıcılarda test ederse, işe yarayıp yaramadığını duymaktan mutluluk duyarım


Aynı sorun kromda da var. Böyle bir acı!
qodeninja

ps şimdi ona baktığımda, dönüş yanlışının tetiklediği (ve stopPropagation) tetiklediğinden, önekleme gereksiz olduğunu düşünüyorum, ancak soru için çok önemli olduğundan emin değilim
Eran Medan

7

FireFox, IE ve Chrome'u desteklemek için birkaç seçeneği birleştirdim. Mac'i daha iyi desteklemek için de güncelledim

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

Web uygulamalarının varsayılan kısayol tuşlarımı dürüstçe geçersiz kılmamasını istiyorum. Ctrl+ Starayıcılarda zaten bir şey yapıyor. Görüntülediğim siteye bağlı olarak bu değişikliği aniden bozmak, sıkıcı ve sinir bozucu, sık sık buggy bahsetmiyorum. Ben siteleri kaçırmak yaşadım Ctrl+ Tabo da aynı görünüyordu çünkü Ctrl+ Ihem sitede çalışmalarımı mahvediyor ve her zamanki gibi sekmeleri anahtarlama beni engelleyen.

Kısayol tuşları istiyorsanız, accesskeyözelliği kullanın . Lütfen mevcut tarayıcı işlevlerini bozmayın.


2
Tamamen katılıyorum, ama ne yazık ki karar verici değil, peon uyguluyorum.
ceejayoz

24
Doğru, ancak CTRL + S sık kullanılan bir özellik değil. İnsanların bunu özleyeceğinden şüphe ediyorum, özellikle de dosyanızı web uygulamanıza kaydedebileceğiniz anlamına gelir.
EndangeredMassa

13
Normalde size katılıyorum ama sadece zaman hiç ben bir webapp kullanıyorum unutup kısayol işe yarar bir şeyler beklediğiniz bir tarayıcıda ctrl-s kullanmaktır. Normalde hayal kırıklığına uğradım. Gmail, e-postanızı ctrl-s tuşlarına bastığınızda kaydeder, ancak hiçbir zaman fark etmeyeceksiniz, çünkü beklediğiniz şeyi ve her masaüstü uygulamasının ne yaptığını gerçekten fark etmezsiniz. Gmail'i HTML olarak kaydetmek istediğinizi düşündüğünüzde fark edersiniz ve sinir bozucu olur.
Carson Myers

4
Bu gerçekten uygulamaya bağlıdır. Bir terminal emülatörü web uygulaması oluşturuyorum ve ctrl + c'yi geçersiz kılmak gerekli değilse pratik görünüyor.
Brack

Aslında bir HTML sayfası kaydetme ihtiyacı oldukça incedir, kendimi bunu asla yapmıyor. Bununla birlikte, diğerlerinin söylediği gibi, tarayıcı hızlı bir şekilde çalıştığımız yer haline geliyor, tüm işlerimiz ve giderek daha fazla tarayıcı kelime işlemcilerin ve masaüstünde geleneksel olarak kullanılan diğer uygulamaların yerini alıyor, kullanıcılar klavyelerine alışkın kısayollar, bu yüzden onları desteklemek kullanılabilirlik ve benimsenmesi için bir zorunluluktur. Bir kelime işlemci oluşturursanız ve ALT + SHIFT + S veya daha kötü bir şeyle vurmamı sağlarsanız, uygulamanızı kullanıcı olarak kötü bir alışkanlık gibi dökeceğim.
DavidScherer

4

@Eevee: Tarayıcı daha zengin ve daha zengin işlevsellik için bir yer haline geldikçe ve masaüstü uygulamalarının yerini almaya başladığında, klavye kısayollarının kullanılmasını bırakmak için bir seçenek olmayacak. Gmail'in zengin ve sezgisel klavye komutları kümesi, Outlook'u terk etme isteğimde etkili oldu. Todoist, Google Reader ve Google Takvim'deki klavye kısayolları hayatımı günlük olarak çok daha kolay hale getiriyor.

Geliştiriciler, tarayıcıda zaten bir anlamı olan tuş vuruşlarını geçersiz kılmamaya kesinlikle dikkat etmelidir. Örneğin, içine yazdığım WMD metin kutusu, Ctrl+ Delkelimesini "ileriye doğru sil" yerine "Blockquote" olarak yorumluyor . Site geliştiricilerinin kullanabileceği ve tarayıcıların gelecekteki sürümlerde uzak durmayı taahhüt edeceği "tarayıcı açısından güvenli" kısayolların bir yerinde standart bir liste olup olmadığını merak ediyorum.


1
Cevap hayır, güvenli tarayıcı kısayollarının bir listesi yok. Ve iki rezonans için iyidir: 1. Kısayol özelleştirilebilir (en azından Opera'da). 2. Bunu yaptığınızda, tarayıcı kullanımı için size daha fazla güç sağlamak üzere tarayıcı satıcısının yaratıcılığını kısıtlamazsınız.
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.

Bu, @ AlanBellows'un cevabının yerini whichalan güncel bir sürümüdür key. Ayrıca Chrome'un büyük anahtar hatasıyla bile çalışır ( Ctrl+ tuşuna basarsanız Ss yerine büyük S harfi gönderir). Tüm modern tarayıcılarda çalışır.


Bunu test etmek için snippet kutusunun içini tıklayın ve Ctrl + S tuşlarına basın.
Cannicide

1

Bu, diğer önerilerden daha kolay okunabilen, kolayca diğer anahtar kombinasyonlarını içerebilen ve IE, Chrome ve Firefox'ta test edilmiş olan benim çözümümdü:

$(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
+1 kullanımı için String.fromCharCode. Bununla birlikte, Mac'lerde bir kontrol anahtarı yoktur. Komut tuşunu ile test edin evt.metaKey. trueMac'te Cmd ve Windows'ta Win için geri döner .
KatoFett


0

Bu işe yaramalıdır ( https://stackoverflow.com/a/8285722/388902 adresinden uyarlanmıştır ).

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'a cevap:! (E.altKey) AltGryazarken kullanan kullanıcılar için eklendi (örneğin Polonya). Bu basmadan AltGr+ Saynı sonucu verecektir 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

Benim tarafımdan yapılan bu eklenti yardımcı olabilir.

Eklenti

Bu eklentiyi, bu şekilde çalıştırılacak anahtar Kodları ve işlevi sağlamanız gerekir

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

Kodda ben Ctrl+ için nasıl performans gösterdik S. Bağlantıda Ayrıntılı Belgeler alacaksınız. Eklenti, JavaScript kod bölümünde Codepen üzerindeki Kalemim bölümünde.


0

IE'de sorunumu çözdüm ve alert("With a message")varsayılan Davranışı önlemek için:

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;
        }
    }
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.