2013-05-29 44 views
4

我試圖創建一個簡單的JavaScript程序,它讀取keydown事件並將它們轉換爲HTML畫布上的移動。到目前爲止,我已經獲得了相當大的成功,我遇到了一個奇怪的問題(我認爲是)箭頭鍵優先級。會發生的是,如果我按住右箭頭,並按下左箭頭,則左箭頭接管。如果我按住左箭頭,並按下右箭頭,則沒有任何變化(我正在移動的區塊繼續向左移動)。我已經改變了關鍵字閱讀的順序,但沒有成功。javascript keydown事件的優先級是多少(如果有的話)?

我讀keydowns和keyups代碼是這樣的:

//Listener for when keys are pressed 
window.addEventListener('keydown', function (event) { 
    keyCodes[event.keyCode] = true; 
}); 

//Listener for keys being released 
document.addEventListener('keyup', function (event) { 
    keyCodes[event.keyCode] = false; 
}); 

據然後在這裏解釋

//movement function 
function move() { 
    if (keyCodes[right]) { 
     velX = 12.0; 
    } 
    if (keyCodes[left]) { 
     velX = -12.0; 
    } 
}; 

function update() { 
    if (keyCodes[right] || keyCodes[left]) 
     move(); 

    posX += velX; 

    if (!keyCodes[right] && velX > 0) 
     velX -= gravity; 
    if (!keyCodes[left] && velX < 0) 
     velX += gravity; 
}; 

有人能看到,或者有沒有人已經知道,爲什麼左鍵將採取優先於正確的一個?

解決:

更正移動功能如下:

function move() { 
    if (keyCodes[left] && velX > -12.0) { 
     velX -= 2.0; 
    } 
    if (keyCodes[right] && velX < 12.0) { 
     velX += 2.0; 
    } 
}; 
+1

你說的是兩個鍵同時關閉?瀏覽器的行爲是否相同?作爲一個測試,我建議你在'move()'和'update()'(首先測試'keyCodes [left]'值)中顛倒'if'語句的順序。看看是否改變了行爲。如果是這樣,問題在於你處理事件的邏輯。如果沒有,這可能是JS處理多次印刷(也可能是瀏覽器特定)時的某種模糊性。 –

+0

是的,兩個按鍵同時按下。我嘗試過跨瀏覽器,並得到相同的結果,並改變處理的順序沒有幫助。 – Caleb

+0

更正:重新排序它們會導致相反的情況發生。我以前在重新訂購時一定錯過了。謝謝你的幫助! – Caleb

回答

0

在你的職責,你第一次檢查,如果按下右鍵,那麼你檢查左鍵是按下。如果未按下右鍵,則只應檢查左鍵

... 

    if (keyCodes[right]) { 
     velX = 12.0; 
    } 
    // note the "else" before the "if" 
    else if (keyCodes[left]) { 
     velX = -12.0; 
    } 

    ... 

    if (!keyCodes[right] && velX > 0) 
     velX -= gravity; 
    // again note the "else" 
    else if (!keyCodes[left] && velX < 0) 
     velX += gravity; 

    ...