2011-08-31 63 views
4

我試圖在Safari中截取命令+按鍵。我下面增加一個事件處理程序:在Safari中檢測命令+按鍵

document.onkeypress = handleKeyPress; 

function handleKeyPress(event) { 
    if ("+" === String.fromCharCode(event.charCode) && event.metaKey) { 
     // my code here 
     return false; 
    } 
    return true; 
} 

當我打命令轉變=轉變=+我美式鍵盤上),if語句不返回真正。

如果我刪除if語句的event.metaKey部分和命中轉變=,if語句不返回true。

另外,如果我改變匹配字符串從「+」到「=」並按命令=(帶或不帶shift鍵),if語句不返回true。

有沒有一種方法可以實際檢測到command + keypress(沒有假設+鍵是shift =並檢查event.shiftKey,因爲對於某些非美國鍵盤,這不會是真的)?

回答

4

首先,我不一定建議使用⌘+作爲快捷方式,因爲它已經意味着Safari中的某些內容(即縮放頁面)。有人可能希望它仍能正常工作。取決於您正在構建的內容,它可能是有道理的,但除非您確定,否則不要覆蓋默認快捷方式。

無論如何:Key events are tricky,通常是因爲keyCode/charCode /哪些屬性並不總是與正確的字母匹配,所以String.fromCharCode不會總是讓你一個正確的字符串。 keyIdentifier有時候看起來更好,但並不總是(例如,它的字母鍵代碼總是大寫字母)。

我過去做過的事情(我不確定這是做這件事的最好方法,但它工作正常),而是監聽keydown和keyup事件,以及「stack」修飾符鍵。即每當一個鍵被按下時,檢查它是否是修飾鍵(即,如果它是cmd,ctrl,alt或shift)。如果是,請將其添加到修改器的「堆棧」中。在keyup上做相反的事情;如果釋放的鍵是修飾符,則將其從堆棧中移除。

現在回到keydown處理程序,如果該鍵不是修飾鍵,那麼可以發送keydown事件(與按鍵事件不同,它具有相當可靠的keyIdentifier屬性來檢查),而一堆修飾符沿着一些其他回調,這將從那裏採取。

在你的情況下,這樣的回調將檢查cmd鍵是否在堆棧中,並且keydown事件的keyIdentifier是「U + 002B」(這是+的Unicode代碼)。

I've put together a jsfiddle example我在說什麼。如果您單擊「結果」窗格(以確保它已獲得焦點),並按⌘+,它應顯示您使用的組合鍵,並寫入「成功!」。下面。否則,它只會顯示關鍵組合。在我的鍵盤上,加號可以直接訪問,所以我看到的組合鍵就是「⌘+」。但是,如果您需要移位鍵入加號,則應該看到「⇧⌘+」。

這是一段廣泛的代碼,適合在Safari/Mac中處理鍵盤快捷方式,所以如果你願意的話,你可以在其上構建它。您將需要添加一些事件偵聽器來重置模糊事件等的修改器堆棧。理想情況下,修改器堆棧會在您釋放鍵時自動重置,但由於某些事件可能會導致瀏覽器或觀察到的元素/窗口/文檔失去焦點,因此不會處理鍵盤事件,並且釋放的鍵會贏得不能從堆棧中移除。所以檢查模糊事件。

+0

首先,我同意100%小心劫持⌘+。我有一個插件可以覆蓋內置的縮放命令並在每個站點上調用縮放級別,所以我認爲在這種情況下它是合適的。其次,謝謝你的回答。我想你已經提供了我需要的所有工具來找出答案,但是我需要一整天的時間來確保我可以獲取這些信息並使其滿足我的需求。 –

+0

完美的作品......謝謝!對jsfiddle示例的一個小修正是,在exampleCallback函數中,有'='鍵(U + 003D)的unicode,而不是'+'鍵(U + 002B)。 –

+0

@CeriMorgan:啊,對不起。當我把jsfiddle放在一起時,我誤解了你的問題,雖然你想聽⌘=,而不是⌘+。我在發佈之前編輯了我的答案,但忘記編輯jsfiddle。無論如何;偉大的代碼否則工作 – Flambino

0

將事件對象註冊到窗口對象級別1中,例如event = window.EE,然後使用Firebug或Safari的Web開發人員工具瀏覽它,並查看所需的觸發值。所以你會知道要比較什麼。

+0

我已經比較了兩種情況下的整個事件對象(command shift =和command =),除了在前一種情況下存在的shiftKey修飾符外,結果看起來完全一樣。但是,我不想做出這樣的假設,即shift =總是+(我已經有一個用戶,這不是真的)。 –

0

不幸的是,我不認爲有答案。問題是,對於CMD+SHIFT+=charCode被按下的是61(=),而不是43(+)。這似乎是系統範圍的設計,因爲Mac OS X本身將CMD+SHIFT+=解釋爲=加上兩個修飾符,而不是+COMMAND

我把一個簡單的jsfiddle顯示此:http://jsfiddle.net/ScuDj/1/

基本上,你將不得不面對的鍵盤佈局,如果你想檢測COMMAND +

或者,您只能支持數字小鍵盤+ - 工作始終如一! (只是開個玩笑;-)

(另外:我試圖附加到textInput事件,但無法得到它在全球範圍內註冊,我認爲它只適用於domNodes,我沒有真正使用過這個事件。 )