我正在编写一个界面,当按下Escape时会触发取消按钮(如果有)。但我不想干扰标准逻辑,如果打开select
下拉列表,Escape将关闭列表。如果select
元素恰好具有焦点,那么接口应该被取消。
在Chrome和Opera中,当select
列表打开时,按Escape键不会触发任何事件,因此默认情况下一切正常。
在Safari中,有一个keyup
事件,但在此上下文中没有前一个keydown
事件。我可以通过在keydown
上设置一个标记来解决,然后我可以在keyup
上查看。
var _menuEscapeState = false
,_menu = document.getElementById( 'menu' );
_menu.addEventListener( 'keydown' ,function( e ) {
var e = e || window.event;
_menuEscapeState = ( e.which === 27 );
} );
_menu.addEventListener( 'keyup' ,function( e ) {
var e = e || window.event;
if( e.which === 27 && _menuEscapeState ) {
// DO STUFF
}
_menuEscapeState = false;
} );
但是在Firefox中,当关闭keyup
列表时,keydown
和select
似乎都会被激活。那么有没有办法检测列表是否已打开以便能够过滤掉它?或者是检测Firefox使用的唯一选项,只是在此浏览器中禁用Escape-to-cancel功能?
顺便说一句,我没有IE测试,这就是为什么现在没有提到它,尽管该网站主要是为了在Mac上使用。