【问题标题】:how can i track arrow keys in Chrome and IE?如何在 Chrome 和 IE 中跟踪箭头键?
【发布时间】:2011-09-07 18:49:49
【问题描述】:

我正在使用以下代码来跟踪关键事件

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

它在 Firefox 中给我警报,但在 IE 和 chrome 中没有。它给了我所有其他键盘字符,但没有 esc 键和箭头键。

如何使用 javascript 检测 chrome 和 IE 中的 esc 键和箭头键??

【问题讨论】:

  • 这是因为在浏览器之间将事件附加到 DOM 节点的方式存在差异。我不确定不同浏览器的确切代码是什么。

标签: javascript events keyboard


【解决方案1】:

您实际上并不需要 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();
};

【讨论】:

  • 我需要使用小写的 onkeydown 来让它在 Opera 中工作。即document.onkeydown = function(event) { ... }
【解决方案2】:

我刚刚遇到了同样的问题。 Chrome 处理keypress 和keydown/keyup 事件至少有一个区别。箭头键不会触发 Chrome 中的 keypress 事件,而对于 keydown 和 keyup 会触发。

【讨论】:

  • 目前只有正确答案。你不需要技巧来解决这个问题
【解决方案3】:

问题:当您执行 shift-7(与号)时,webkit 会向按键发送一个键码 38(向上箭头)。

总结: & 和 up 都等于 38. % 和 left 都等于 37. ' 和 right 都等于 39. (并且 down 都等于 40。对于 firefox 和 opera,37/38/ 39/40 不发送 &, %, ', (。他们只发送那些向上、向下、向左、向右。但是 webkit 和即为箭头键和 &, %, 发送 37/38/39/40 ', (。请注意,对于上/下/左/右,webkit 将 charCode 设置为 0,但对于 &, %, ', (.

解决方案:因此,如果您通过键码处理这些事件,则需要在按下 shift 键时忽略或检查 charCode 是否为 0

【讨论】:

    【解决方案4】:

    使用 jQuery 并使用类似这样的东西:

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

    字符代码:

    37:左

    38:向上

    39:正确

    40:下降

    【讨论】:

      【解决方案5】:

      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;
            }
          });
      
      });
      

      【讨论】:

        【解决方案6】:

        这是一个简洁的表述:

        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
        

        【讨论】:

          【解决方案7】:

          这在 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
          

          【讨论】:

            猜你喜欢
            • 2021-01-19
            • 2013-04-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多