2012-07-16 77 views
12

使用的例子之一,從先前的問題,我有:jQuery的按鍵事件和Ctrl + S

$(window).keypress(function(event) { 
    if (!(event.which == 115 && event.ctrlKey) && !(event.which == 19)) return true; 
    $("form input[name=save]").click(); 
    event.preventDefault(); 
    return false; 
}); 

是否也可以改變這爲Mac CMD關鍵工作?

我試過(!(event.which == 115 && (event.cmdKey || event.ctrlKey)) && !(event.which == 19))但這沒有奏效。

+1

的可能重複[?我怎樣才能捕捉命令+ S jQuery中(http://stackoverflow.com/questions/ 5833325/how-can-i-capture-commands-in-jquery)':)' – 2012-07-16 10:03:45

+0

鍵盤事件在瀏覽器和操作系統之間很不一致。只需編寫一個小例子,並在按cmd + S時檢查哪些鍵和修飾符被觸發。 – Christoph 2012-07-16 10:17:13

+0

我不能說這是肯定的,但作爲一般規則,我認爲你想避免改變瀏覽器的默認行爲(ctrl + s/cmd + s ===「將頁面另存爲」) – 2014-12-18 18:34:26

回答

22

使用event.metaKey檢測Command鍵

$(document).keypress(function(event) { 
    if (event.which == 115 && (event.ctrlKey||event.metaKey)|| (event.which == 19)) { 
     event.preventDefault(); 
     // do stuff 
     return false; 
    } 
    return true; 
}); 
+3

錯字缺少括號。我試圖編輯這個,但得到錯誤:「編輯必須至少有6個字符;有沒有其他改進在這個職位?愚蠢的stackoverflow – 2012-10-12 08:17:50

+6

不幸的是,這不適合我鉻(版本27.0.1453.110)。它總是打開「另存爲」對話框... - CTRL + S另一方面工作 – 2013-06-10 23:14:53

+0

甜'metaKey' – brasofilo 2014-10-03 15:42:27

3

爲了檢測ctrl+scmd+s,你可以用這樣的方式:

Working jsFiddle.

的jQuery:

var isCtrl = false; 
$(document).keyup(function (e) { 
if(e.which == 17) isCtrl=false; 
}).keydown(function (e) { 
    if(e.which == 17) isCtrl=true; 
    if(e.which == 83 && isCtrl == true) { 
     alert('you pressed ctrl+s'); 
    return false; 
} 
}); 

source (includes all keyboard shorcuts and buttons)

+0

好的,你能解釋一下嗎?爲什麼這是比其他答案更好的解決方案? – 2013-07-19 07:45:53

+0

在我的Macbook(Chrome和Safari)cmd + s不工作,直到您按ctr + s。然後兩個工作。奇怪的。 – 2013-07-22 16:40:21

+0

@ T.BrianJones在不同的瀏覽器上發生同樣的事情。我想瀏覽器的'保存'功能可以防止我們的功能/: – 2013-07-22 21:18:58

1

這個工作對我來說:

$(document).keypress(function(event) { 
    if ((event.which == 115 || event.which == 83) && (event.ctrlKey||event.metaKey)|| (event.which == 19)) { 
     event.preventDefault(); 
     // do stuff 
     return false; 
    } 
    return true; 
});