2012-10-30 59 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'不起作用 –