2012-11-27 61 views
4

我有兩個事件處理函數,一個用於keydown,一個用於keyup。 keydown事件處理程序觸發警報消息,但是這可以防止觸發按鍵事件。Keyyd在keydown打開警報時未觸發

您可以在這裏看到一個非常簡單的示例:http://jsfiddle.net/boblauer/jaGwT/當keydown打開警報時,不會觸發安全關閉,但當警報未打開時,將啓動安全關閉。下面是從的jsfiddle代碼:

var i = 0; 
window.addEventListener('keydown', function(e) { 
    if (i++ % 2) alert('down'); 
    console.log('down'); 
}); 

window.addEventListener('keyup', function(e) { 
    alert('up'); 
    console.log('up'); 
}); 

我有一個支持聽多鍵組合(如「d + F」)庫,因此當有鍵按下時,我需要將其添加到列表當前按下的鍵,以及釋放鍵時,我需要將其從列表中刪除。我遇到的問題是,如果我想要在顯示d + f時同時顯示警報,那麼從「當前按下」列表中刪除這些按鍵的代碼不會觸發,因爲我的按鍵處理程序永遠不會被調用。

我想不出一個很好的解決這個問題的方法。有任何想法嗎?

+0

這是因爲'alert()'塊 - 你不應該使用'alert()'......來設計你的網站,或者使用某種類型的對話框。 – ahren

+0

在其他情況下也會發生這種情況,例如在超鏈接上標籤,然後點擊回車打開鏈接。當發生這種情況時,enter的keyup事件不會被觸發。 –

回答

3

該警報可防止事件發生。你可以做的是手動觸發這個功能,因爲它總是發生。

var keyupfunction = function(e){ 
    alert('up'); 
    console.log('up'); 
} 

window.addEventListener('keyup', keyupfunction); 

window.addEventListener('keydown', function(e) { 
    if (i++ % 2) alert('down'); 
    console.log('down'); 
    keyupfunction(e); 
}); 

但是真的,你不應該使用警報。它阻止了這些事件,但誰知道它還有什麼可能會破裂。改用自定義的東西。

+0

該keyup不一定遵循keydown事件。例如,我可以按住ctrl,然後按另一個鍵而不用按ctrl。 –

+0

@BobLauer確切的,但在警報的情況下,沒有其他方式 –