2011-06-03 42 views
10

即时通讯使用foloowing代码追踪关键事件我如何跟踪Chrome和IE中的箭头键?

oEvent=window.event || oEvent; 
    iKeyCode=oEvent.keyCode || oEvent.which;alert(iKeyCode); 

在Firefox,而不是在IE和Chrome它给我警报。它给我所有其他keyborad字符,但不是esc键和方向键。

我该如何检测铬和IE浏览器中的Esc键和箭头键使用JavaScript?

+0

这是因为您将事件附加到浏览器之间的DOM节点时存在差异。我不确定不同浏览器的确切代码是不是tho。 – bigblind 2011-06-03 12:08:03

回答

3

使用jQuery和使用是这样的:

$(document).keydown(function(e){ 
    if (e.keyCode == 37) { 
     alert("left pressed"); 
     return false; 
    } 
}); 

字符代码:

37:左

38:最高

39:右

40:向下

2

Demo

尝试使用jquery库做你所需要的,然后在下面调用。在演示中,您可以在输入框中单击,然后开始输入。它会通过关键代码提醒您。您可以将该事件侦听器绑定到页面的任何元素。它不一定只是一个输入。

$(document).ready(function() { 
    KEY_CODES = { 
     37: 'left', 
     38: 'up', 
     39: 'right', 
     40: 'down' 
    } 

    KEY_STATUS = { keyDown:false }; 
    for (code in KEY_CODES) { 
     KEY_STATUS[KEY_CODES[code]] = false; 
    } 

    $(window).keydown(function (e) { 

     KEY_STATUS.keyDown = true; 

     // perform functionality for keydown 
     if (KEY_CODES[e.keyCode]) { 
      e.preventDefault(); 
      alert('arrow'); 
      if(e.keyCode == 40) 
      { 
       // Arrow Down 
      } 

      else if(e.keyCode == 39) 
      { 
       // Arrow Right  
      } 

      else if(e.keyCode == 38) 
      { 
       // Arrow Up  
      } 

      else if(e.keyCode == 37) 
      { 
       // Arrow Left  
      } 

     } 

    }).keyup(function (e) { 
     KEY_STATUS.keyDown = false; 
     if (KEY_CODES[e.keyCode]) {   
     e.preventDefault(); 
     KEY_STATUS[KEY_CODES[e.keyCode]] = false; 
     } 
    }); 

}); 
+0

即使这不适用于我的系统中的Chrome和IE – developer 2011-06-03 12:17:32

+0

该演示程序不适合您?我使用chrome创建它。 – jnoreiga 2011-06-03 12:22:51

+0

我为你更新:) – jnoreiga 2011-06-03 12:27:30

17

你并不真的需要JQuery,尽管它确实缩短了你的代码。

您将不得不使用keyDown事件,keyPress将不能在旧版本的IE中使用箭头键。

这里有一个完整的教程,你可以用,看到接近页面的底部箭头键的例子: http://www.cryer.co.uk/resources/javascript/script20_respond_to_keypress.htm

下面是一些代码,我使用的,有点简化,因为我必须处理重复缓冲按键:

document.onkeydown = function(event) { 
    if (!event) 
      event = window.event; 
    var code = event.keyCode; 
    if (event.charCode && code == 0) 
      code = event.charCode; 
    switch(code) { 
      case 37: 
       // Key left. 
       break; 
      case 38: 
       // Key up. 
       break; 
      case 39: 
       // Key right. 
       break; 
      case 40: 
       // Key down. 
       break; 
    } 
    event.preventDefault(); 
}; 
+2

不适用于Chrome这里的箭头键 – herophuong 2012-06-18 06:18:50

+0

在Chrome上适用于我http://jsfiddle.net/Ueqms/ – Gaurav 2012-06-19 03:15:15

+0

我需要使用小写onkeydown才能在Opera中工作。即'document.onkeydown = function(event){...}' – 2014-08-21 04:00:38

10

我刚刚面临同样的问题。 Chrome处理keypress和​​/keyup事件至少有一处不同。 Chrome中的keypress事件未针对箭头键触发,而​​和keyup则是。

6

问题:当你做shift-7(&符号)时,webkit发送一个键码38(向上箭头)到按键。

摘要: &和向上都等于38%和左都等于37'和右都等于39(上下两个Firefox和歌剧等于40,则37/38/39/40 AREN '(''''),(。他们只发送那些向上,向下,向左,向右,但webkit和即发送37/38/39/40箭头键和&,%,',(。请注意,对于上/下/左/右,webkit将charCode设置为0,但对于&,%,',(。

解决方案:因此,如果您的键码处理这些事件,你需要或者忽略当变速键关闭或检查charCode为0

0

这里是一个简洁的表述:

document.onkeydown = function(e) { 
    switch (e.keyCode) { 
     case 37: 
      alert('left'); 
      break; 
     case 38: 
      alert('up'); 
      break; 
     case 39: 
      alert('right'); 
      break; 
     case 40: 
      alert('down'); 
      break; 
    } 
}; 

但是,如果你正在使用JQuery,你最好使用e.which,这JQuery的“规范化“来解决跨浏览器差异:

$(document).keydown(function(e) { 
    switch(e.which) { 
     // the rest is the same 
0

这对我在Opera20和IE8中工作。 (我没有Chrome可以测试。)

var keyPressListenerFn = function(event) { 
    if (!event){ event = window.event } 
    var code = event.charCode && event.keyCode == 0 ? event.charCode : event.keyCode 
    switch(code) { 
     case 37: prev(); break // left 
     case 39: next(); break // right 
    } 
    if (event.preventDefault){ event.preventDefault() } // opera20 
    if (event.returnValue){ event.returnValue = false } // ie8 
} 
var addEvent = document.attachEvent ? document.attachEvent : document.addEventListener 
addEvent('keydown', keyPressListenerFn) // opera20 
addEvent('onkeydown', keyPressListenerFn) // ie8