2012-10-30 104 views
2

我使用的是M1釋放,寫了一個關鍵的處理程序是這樣的:在FF或IE跨瀏覽器的關鍵事件處理程序飛鏢

void _onKeyPress(KeyboardEvent e) { 
    switch (e.keyIdentifier) { 
    case KeyName.UP: 
    case KeyName.LEFT: 
     e.preventDefault(); 
     prev(); 
     break; 

    case "U+0020": // FIXME Must be a better way, or? 
    case KeyName.DOWN: 
    case KeyName.RIGHT: 
     e.preventDefault(); 
     next(); 
     break; 
    } 
} 

它工作正常,在Chrome,但不是。必須有更好的方法來處理空格鍵,並將其保存在一個開關中,對嗎?我知道我可以查看其他字段來獲得空間,但這不是一個好的選擇(因爲那時我會將代碼分成兩個switch語句)。無論如何,它在FF和IE中不起作用的問題更糟糕。如果我改寫爲使用keyCode,它可以在所有瀏覽器上正常工作。

void _onKeyPress(KeyboardEvent e) { 
    switch (e.keyCode) { 
    case 38: 
    case 37: 
     e.preventDefault(); 
     prev(); 
     break; 

    case 32: 
    case 40: 
    case 39: 
     e.preventDefault(); 
     next(); 
     break; 
    } 
} 

我的問題是,我找不到虛擬鍵碼的常量。難道我做錯了什麼?處理Dart中跨瀏覽器兼容的關鍵事件的最佳方式是什麼?

回答

1

根據您的問題,對方的回答,這source code,這bug(你應該STAR),這裏是我的建議:

  • 使用keyCode。
  • 如果需要,不要害怕使用if/else if而不是switch語句。反正JavaScript沒有優化的switch語句。
  • 直到this bug得到修復,您應該創建自己的常量。

更新:這一直是fixed

+0

感謝jj,我不害怕if/else,但是你必須同意,與開關相比,你會失去清晰度,我會問問題: - ) –

+0

謝謝你主演,托比亞斯:)是的,我同意你失去了清晰度與開關相比。 –

+1

這已修復!更新了我的答案。 –

0

我認爲這是一個類似的問題,這個issue。顯然,KeyIdentifier在Firefox上返回null。

順便說一句,而不是「U + 0020」,你可以使用KeyName.SPACEBAR

+1

是的,但我認爲它與FF和IE中的DOM有關(我認爲這是[本期](https://bugzilla.mozilla.org/show_bug.cgi?id=680830) 。我希望dart api的設計背後有一些想法,以一種很好的方式做到這一點,但也可能是他們等待DOM的實現...... 但是沒有'KeyName.SPACEBAR'不起作用 –