2014-02-28 37 views
12

當有人擁有修飾鍵(Shift,Alt,Ctrl)時,我的應用會更改其狀態。我使用keydown/keyup事件跟蹤修改鍵:在沒有觸發鍵盤或鼠標事件的情況下檢測按下的修飾鍵

var altPressed; 
window.onkeydown = window.onkeyup = function(e) { 
    altPressed = e.altKey; 
} 

鍵盤事件不會在瀏覽器選項卡外觸發。現在,想象一下以下情形:

  1. 按住Shift鍵
  2. 點擊一個鏈接到我的應用程序,它會在新窗口中打開
  3. 鬆開Shift鍵

keyup事件贏得」當它沒有被聚焦時我的頁面就會發生火災,所以我的應用程序會在我再次關注我的應用程序的選項卡時顯示,它將顯示Shift鍵仍然被按下。

如果page visibility events有修飾鍵屬性,會不錯。唉,他們沒有。

document.addEventListener('webkitvisibilitychange', function(e) { 
    if (document.webkitHidden) return; 

    e.altKey // undefined :(

}, false); 
+0

所以,你想知道在加載頁面之前哪些按鍵被按下了?如果是這樣,這可能是一個艱難的道路...... – rvighne

+0

你能給出一個理由,你爲什麼想這麼做嗎?該頁面可能會在後臺加載,因此無法始終獲得關鍵事件 – charlee

+3

您實際嘗試解決什麼問題?到目前爲止,看起來您只是描述了您所觀察到的行爲,而且我沒有看到您需要求解幫助的特定問題描述。 – jfriend00

回答

4

最好的我想出迄今:

document.body.onkeydown = function(e) { 
    if (e.which === 18) { 
    alt_state.textContent = 'pressed'; 
    } 
}; 

document.body.onkeyup = function(e) { 
    if (e.which === 18) { 
    alt_state.textContent = 'released'; 
    } 
}; 

function detectAlt() { 
    if (document.webkitHidden) return; 
    window.addEventListener('mousemove', function onMove(e) { 
    alt_state.textContent = e.altKey ? 'pressed' : 'released'; 
    window.removeEventListener('mousemove', onMove, false); 
    }, false); 
} 

document.addEventListener('webkitvisibilitychange', detectAlt, false); 
window.addEventListener('load', detectAlt, false); 

按下Alt鍵並單擊鏈接:jsbin

它依靠mousemove事件,這與loadvisibilitychange事件不同,具有altKey屬性。作爲缺點,在人移動鼠標之前它不會檢測到altKey。

+0

mousemove始終運行detectAlt(),即使它只是一個if()return;它仍然在運行!(沒有投票支持這個,它仍然是一個解決方案) – JDuarteDJ

+1

@JDuarteDJ onMove在每個mousemove上運行,但是如果您檢出代碼,它在第一次運行後會被刪除。當load和webkitvisibilitychange事件觸發時,detectAlt會運行。 – Tibos

+0

仍然大部分時間處於開啓狀態。自加載直到ALT下來,然後自可見直到下一個ALT下來。基本上每當它不閒置! 你如何看待我的答案? – JDuarteDJ

1

我能想到的2種選擇:

  1. 使用定時 「ALT狀態」 - 2秒後>宣佈ALT未按。

    document.body.onkeydown = function(e) { if (e.which === 18) { alt_state.textContent = 'pressed'; setTimeout(function(){ alt_state.textContent= ""; },2000); } };

  2. 當能見度失去只需重置所有的ALT標記。

    document.addEventListener('webkitvisibilitychange', function(e) { 
        if (document.webkitHidden){ 
         altPressed = ""; 
         return; 
        } 
    }, false); 
    

試試這個:http://jsbin.com/jihuyibu/1/edit 這是我最好的猜測,即便如此,它從來沒有出來完美。

+0

重置...所有的東西? – Martin

+0

我沒有看到這個工作。另外,你鏈接到我自己的jsbin。 – NVI

+0

@Martin是重置所有修改標誌。 NVI我用你的代碼做了一個小改動2.仔細看 – JDuarteDJ

相關問題