JavaScript / jQuery:用于键盘导航的键盘(event.which不起作用)

处理关键[Up | Down | Press]事件时,我应该使用.which还是.keyCode? 我可以使用一些示例代码来处理jQuery中的三个键盘事件吗? 你能不用jQuery做到吗? 我希望它在每个浏览器中可靠地工作。

更新

奇怪的是,jQuery的event.which规范化不适用于我的handleKey Press (事件)处理程序:

// Add which for key events if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) { event.which = event.charCode || event.keyCode; } 

我在handleKey Press中的这个规范化之前和之后得到了这个(它没有将event.which设置为event.keyCode中的值):

  • event.which = 0
  • event.charCode = 0
  • event.keyCode = 40

但是,如果我使用handleKey Down代码,则代码可以正常工作。 我认为它与keypress vs. keydown有关; 该代码适用于我的handleKey Down (事件)处理程序。

不幸的是,我需要使用keypress (而不是keydown),因为我想使用箭头键进行导航:如果用​​户按下并按住箭头键,则会触发一次 keydown事件,但会为每个插入触发单独的按键事件字符)。

jQuery规范化event.which (参见: api.jquery.com/event.which/ ),这就是你所需要的。

请参阅与您的问题相关的此主题 。

一般来说,我经常争论.which,因为它可以让你跟踪charCodes和keyCodes。 event.which内置于jQuery中,以规范化这些不同的方法。

您可以在此处找到有关keyCodes的更多信息。

有关keypress()的文档,请参阅jQuery API,您可以绑定它。 http://api.jquery.com/keypress/

此外,这是使用jquery进行按键导航的一个很好的演练: http : //net.tutsplus.com/tutorials/javascript-ajax/how-to-create-a-keypress-navigation-using-jquery/

编辑:来自API的重要/更相关的行:

如果需要捕获任何位置的按键(例如,在页面上实现全局快捷键),将此行为附加到文档对象会很有用。 由于事件冒泡,除非明确停止,否则所有按键操作都将使DOM上升到文档对象。

要确定输入了哪个字符,我们可以检查传递给处理函数的事件对象。 虽然浏览器使用不同的属性来存储此信息,但jQuery会规范化.which属性,以便我们可以可靠地使用它来检索字符代码。

请注意,keydown和keyup提供一个代码,指示按下哪个键,而keypress指示输入了哪个字符。 例如,小写“a”将通过keydown和keyup报告为65,但是按key按97报告。 所有事件都报告大写“A”为65。 由于这种区别,当捕获箭头键,.keydown()或.keyup()等特殊击键时,这是一个更好的选择。

根据这个页面 :

event.whichkeydownkeyup IE <9中未定义。

对于返回字符的键,在keypress上Gecko(Seamonkey,Firefox)中的event.keyCode为0。

event.charCode仅在Internet Explorer(Mac)的keydown和keyup上受支持。

在JSFiddle上试试吧