2010-02-07 120 views
15

按下我试图设置一个菜单,可以通过箭头键导航。我在Firefox中有这个工作。检测箭头键在IE浏览器通过JavaScript/jQuery

试图让它在IE8中工作并经过一番努力后,发现它是因为IE8不会在箭头上注册按键。测试:

$(document).keypress(function (eh){ 
    alert(eh.keyCode); 
}; 

在Firefox中,按任意的箭头键的将触发的37,38,39或40

警报在IE8,什么都没有。标准QWERTY键盘上的任何其他键都可以注册,但不能使用箭头键。

这是我的Javascript的问题?浏览器设置? Windows设置?

+1

请不要忘记测试用户是否也按Alt键。当您使用进行导航时,这是非常糟糕的行为,同时防止使用来回浏览的默认行为。 – 2010-02-08 03:00:35

+0

@Marcel alt-arrow导航可以做什么?我从来没有使用它,也没有在我使用的浏览器中做任何事情。 – 2010-02-08 15:37:44

+0

至少在Firefox,Chrome和IE中(只是一个快速测试)与按下后退按钮相同,就像按下前进按钮(我经常使用这些热键)。 – 2010-02-08 16:58:14

回答

38

jQuery keypress documentation(介绍文本的最后一段):

注意​​和keyup提供指示按下其中的按键的代码,而keypress表示被输入的字符。例如,小写字母“a”将被报告为​​和keyup 65,但是被keypress报告为97。大写字母“A”在所有事件中报告为97。由于这种区别,当捕捉特殊击键(如箭头键)时,.keydown().keyup()是更好的选择。

它甚至从字面上提到关于箭头键;)这样,你真的需要勾上无论是​​或keyup事件。这是SSCCE与​​,只是copy'n'paste'n'run它。不,您不需要在event上进行浏览器兼容检查,这适用于从IE6到Firefox的所有浏览器。

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2217553</title> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
     <script> 
      $(document).keydown(function(event) { 
       switch (event.keyCode) { 
        case 37: alert('left'); break; 
        case 38: alert('up'); break; 
        case 39: alert('right'); break; 
        case 40: alert('down'); break; 
       } 
      }); 
     </script> 
    </head> 
    <body> 
     <p>Press one of the arrow keys.</p> 
    </body> 
</html> 
+1

+1给你一个彻底的答案。 -1对我来说不是RTFMing。 ; o) – 2010-02-08 15:36:57

+0

不客气。 – BalusC 2010-02-08 15:41:59

+0

对于有此问题的未来人员,请注意,您应该对'$(document)'使用'keydown'事件,而不是'$(window)'(这是我碰到的一个问题)。 – 2012-05-30 13:25:17

7

试试这个:

$(document).keydown(function (e) { 
    if(!e) { 
     e = window.event; 
    } 
    switch(e.keyCode) { 
    case 37: 
     goLeft(); 
     break; 
    case 39: 
     goRight(); 
     break; 
    } 
}); 
+0

是否需要使用jQuery检查'window.event'?我明白它没有必要这样做。 – 2010-02-07 23:36:08

1

因为我有时不想事件给泡了一些按键,我使用类似: 自定义代码/密钥为你觉得合适。

/* handle special key press */ 
function checkCptKey(e) 
{ 
    var shouldBubble = true; 
    switch (e.keyCode) 
    { 
     // user pressed the Tab                                   
     case 9: 
      { 
       $(".someSelect").toggleClass("classSelectVisible"); 
       shouldBubble = false; 
       break; 
      }; 
      // user pressed the Enter  
     case 13: 
      { 
       $(".someSelect").toggleClass("classSelectVisible"); 
       break; 
      }; 
      // user pressed the ESC 
     case 27: 
      { 
       $(".someSelect").toggleClass("classSelectVisible"); 
       break; 
      }; 
    }; 
    /* this propogates the jQuery event if true */ 
    return shouldBubble; 
}; 

/* user pressed special keys while in Selector */ 
$(".mySelect").keydown(function(e) 
{ 
    return checkCptKey(e); 
});