【问题标题】:Detecting arrow key presses in JavaScript检测 JavaScript 中的箭头键按下
【发布时间】:2011-08-01 14:36:54
【问题描述】:

如何检测何时按下箭头键之一?我用这个来发现:

function checkKey(e) {
    var event = window.event ? window.event : e;
    console.log(event.keyCode)
}

虽然它适用于其他所有键,但它不适用于箭头键(可能是因为默认情况下浏览器应该在这些键上滚动)。

【问题讨论】:

    标签: javascript keypress keyboard-events


    【解决方案1】:

    方向键只能由onkeydown触发,onkeypress不会触发。

    键码是:

    • 左 = 37
    • 向上 = 38
    • 右 = 39
    • 向下 = 40

    【讨论】:

    • 有些浏览器确实会触发箭头键的keypress 事件,但你说得对,keydown 总是适用于箭头键。
    • 如果你按%,你也会得到keyCode 37
    • @xorcus -- 不,您会收到带有keydown 事件的53。你得到37keypress,这是另一回事
    • @zyklus 我昨晚读错了。我以为它说的是“或”。对不起,我删除了我的评论。
    • @MrCroft - 或者也收听onkeyup 并在那里停止活动。但是,实际上您不应该使用 Javascript 修改 UI 行为。
    【解决方案2】:

    我已经能够用 jQuery 捕获它们:

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

    一个例子:http://jsfiddle.net/AjKjU/

    【讨论】:

    • keypress 不能使用箭头键。你必须改用$(document).on('keydown', function() {...})
    【解决方案3】:

    使用keydown,而不是keypress 用于不可打印的键,例如箭头键:

    function checkKey(e) {
        e = e || window.event;
        alert(e.keyCode);
    }
    
    document.onkeydown = checkKey;
    

    我找到的最好的 JavaScript 键事件参考(例如,从 quirksmode 中脱颖而出)在这里:http://unixpapa.com/js/key.html

    【讨论】:

    • 现在keypress 已被标记为已弃用
    【解决方案4】:
    function checkArrowKeys(e){
        var arrs= ['left', 'up', 'right', 'down'], 
        key= window.event? event.keyCode: e.keyCode;
        if(key && key>36 && key<41) alert(arrs[key-37]);
    }
    document.onkeydown= checkArrowKeys;
    

    【讨论】:

    • arrs 放在函数之外不值得吗?无需每次调用​​都重新创建它
    【解决方案5】:

    开键上下调用功能。每个键都有不同的代码。

    document.onkeydown = checkKey;
    
    function checkKey(e) {
    
        e = e || window.event;
    
        if (e.keyCode == '38') {
            // up arrow
        }
        else if (e.keyCode == '40') {
            // down arrow
        }
        else if (e.keyCode == '37') {
           // left arrow
        }
        else if (e.keyCode == '39') {
           // right arrow
        }
    
    }
    

    【讨论】:

    • 第二行是做什么的?
    • 澄清一下,'e || window.event' 表示如果 'e' 是一个定义的值,它将是 '||' 的结果表达。如果未定义“e”,则“window.event”将是“||”的结果表达。所以它基本上是:e = e ? e : window.event; 或:if (typeof(e) === "undefined") { e = window.event; }
    • 这是为了让它在旧版本的 IE(IE9 之前)上工作,其中事件没有传递到处理函数中。
    • 请注意 keyCode 是一个数字,最好使用 ===
    • @ketan 关键是 keyCode 是一个数字,应该像 keyCode === 32 一样检查,而不是 keyCode == '32'keyCode === '32'
    【解决方案6】:

    在看到这篇文章之前,我也在寻找这个答案。

    我找到了另一种解决方案来了解不同键的键码,感谢我的问题。我只是想分享我的解决方案。

    只需使用 keyup/keydown 事件在控制台/警报中写入值,同样使用event.keyCode。喜欢-

    console.log(event.keyCode) 
    
    // or
    
    alert(event.keyCode)
    

    - 鲁班

    【讨论】:

      【解决方案7】:

      重新回答您需要keydown 而不是keypress

      假设您想在按下键时连续移动某些东西,我发现keydown 适用于除 Opera 之外的所有浏览器。对于 Opera,keydown 仅在第一次按下时触发。为了适应 Opera 使用:

      document.onkeydown = checkKey;
      document.onkeypress = checkKey;
      function checkKey(e)
      { etc etc
      

      【讨论】:

        【解决方案8】:

        可能是最简洁的表述:

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

        演示(感谢用户 Angus Grant):http://jsfiddle.net/angusgrant/E3tE6/

        这应该可以跨浏览器工作。如果有浏览器不工作的地方请留言。

        还有其他方法可以获取密钥代码(e.which、e.charCode 和 window.event 代替 e),但它们不是必需的。您可以在http://www.asquare.net/javascript/tests/KeyCode.html 试用其中的大部分。 请注意,在 Firefox 中 event.keycode 不能与 onkeypress 一起使用,但它可以与 onkeydown 一起使用。

        【讨论】:

        • 我不得不查找terse 的定义,然后我(爽快地)假设 tersest 是不恰当的变位;唉,我承认:我的关心是refutable
        【解决方案9】:

        这是chrome和firefox的工作代码

        <html>
        <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
        
        <script type="text/javascript">
        
            function leftArrowPressed() {
              alert("leftArrowPressed" );
              window.location = prevUrl  
            }
        
            function rightArrowPressed() {
              alert("rightArrowPressed" );
              window.location = nextUrl  
            }
            function topArrowPressed() {
              alert("topArrowPressed" );
              window.location = prevUrl  
            }
        
            function downArrowPressed() {
              alert("downArrowPressed" );
              window.location = nextUrl  
            }
        
                document.onkeydown = function(evt) {
                                var nextPage = $("#next_page_link")
                                var prevPage = $("#previous_page_link")
                                nextUrl = nextPage.attr("href")
                                prevUrl = prevPage.attr("href")
                evt = evt || window.event;
                switch (evt.keyCode) {
                        case 37:
                        leftArrowPressed(nextUrl);
                        break;
        
                        case 38:
                        topArrowPressed(nextUrl);
                        break;
        
                         case 39:
                        rightArrowPressed(prevUrl);
                        break;
        
                        case 40:
                        downArrowPressed(prevUrl);
                        break;
        
                }
            };
        
        
        </script>
        </head>
        <body>
        <p>
        <a id="previous_page_link" href="http://www.latest-tutorial.com">Latest Tutorials</a> 
        <a id="next_page_link" href="http://www.zeeshanakhter.com">Zeeshan Akhter</a>
         </p>
        </body>
        </html>
        

        【讨论】:

          【解决方案10】:

          那就更短了。

          function IsArrows (e) { return (e.keyCode >= 37 && e.keyCode <= 40); }

          【讨论】:

          • 短是好的:if ([37,38,39,40].indexOf(e.keyCode)!=-1){ console.log('arrow pressed') }
          【解决方案11】:

          这是一个示例实现:

          var targetElement = $0 || document.body;
          
          function getArrowKeyDirection (keyCode) {
            return {
              37: 'left',
              39: 'right',
              38: 'up',
              40: 'down'
            }[keyCode];
          }
          
          function isArrowKey (keyCode) {
            return !!getArrowKeyDirection(keyCode);
          }
          
          targetElement.addEventListener('keydown', function (event) {
            var direction,
                keyCode = event.keyCode;
          
            if (isArrowKey(keyCode)) {
              direction = getArrowKeyDirection(keyCode);
          
              console.log(direction);
            }
          });
          

          【讨论】:

          • 我得到 $0 未定义 var targetElement = typeof $0 !== 'undefined' ? $0 : document.body; 或只是:var targetElement = document.body; 没问题
          【解决方案12】:

          我是这样做的:

          var leftKey = 37, upKey = 38, rightKey = 39, downKey = 40;
          var keystate;
          document.addEventListener("keydown", function (e) {
              keystate[e.keyCode] = true;
          });
          document.addEventListener("keyup", function (e) {
              delete keystate[e.keyCode];
          });
          
          if (keystate[leftKey]) {
          //code to be executed when left arrow key is pushed.
          }
          if (keystate[upKey]) {
          //code to be executed when up arrow key is pushed.
          }
          if (keystate[rightKey]) {
          //code to be executed when right arrow key is pushed.
          }
          if (keystate[downKey]) {
          //code to be executed when down arrow key is pushed.
          }
          

          【讨论】:

            【解决方案13】:

            控制键码 %=37&amp;=38... 并且只有箭头键 left=37 up=38

            function IsArrows (e) {
               return ( !evt.shiftKey && (e.keyCode >= 37 && e.keyCode <= 40)); 
            }
            

            【讨论】:

              【解决方案14】:

              event.key === "ArrowRight"...

              更新更简洁:使用event.key。没有更多的任意数字代码!如果您正在编译或知道您的用户都在使用现代浏览器,请使用它!

              node.addEventListener('keydown', function(event) {
                  const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
              });
              

              详细处理:

              switch (event.key) {
                  case "ArrowLeft":
                      // Left pressed
                      break;
                  case "ArrowRight":
                      // Right pressed
                      break;
                  case "ArrowUp":
                      // Up pressed
                      break;
                  case "ArrowDown":
                      // Down pressed
                      break;
              }
              

              现代开关处理:

              const callback = {
                  "ArrowLeft"  : leftHandler,
                  "ArrowRight" : rightHandler,
                  "ArrowUp"    : upHandler,
                  "ArrowDown"  : downHandler,
              }[event.key]
              callback?.()
              

              注意:旧属性(.keyCode.which)已弃用。

              "w", "a", "s", "d" 方向,使用event.code

              为了支持使用非 qwerty/英文键盘布局的用户,您应该改用 event.code。这将保留物理键位置,即使结果字符发生变化。

              event.key 在 Dvorak 上将是 ,,在 Azerty 上将是 z,使您的游戏无法玩。

              const {code} = event
              if (code === "KeyW") // KeyA, KeyS, KeyD
              

              最理想的情况是,您还允许重新映射键,这对玩家有利,无论他们的情况如何。

              附: event.code 是相同的箭头

              key Mozilla Docs

              code Mozilla Docs

              Supported Browsers

              【讨论】:

              • 感谢您使用 key 而不是 keyCode,它已被弃用。
              • 来自 MDN 的注释:Internet Explorer、Edge(16 及更早版本)和 Firefox(36 及更早版本)使用“Left”、“Right”、“Up”和“Down”而不是“ArrowLeft” "、"ArrowRight"、"ArrowUp" 和 "ArrowDown"。
              • 因为 event.keyCode 已被弃用,这应该是公认的答案
              【解决方案15】:

              这个图书馆太棒了! https://craig.is/killing/mice

              Mousetrap.bind('up up down down left right left right b a enter', function() {
                  highlight([21, 22, 23]);
              });
              

              不过,您需要快速按下序列以突出显示该页面中的代码。

              【讨论】:

                【解决方案16】:

                现代答案,因为 keyCode 现在已弃用,取而代之的是 key

                document.onkeydown = function (e) {
                    switch (e.key) {
                        case 'ArrowUp':
                            // up arrow
                            break;
                        case 'ArrowDown':
                            // down arrow
                            break;
                        case 'ArrowLeft':
                            // left arrow
                            break;
                        case 'ArrowRight':
                            // right arrow
                    }
                };
                

                【讨论】:

                  【解决方案17】:

                  如果您想检测箭头按键但不需要在 Javascript 中指定

                  function checkKey(e) {
                     if (e.keyCode !== 38 || e.keyCode !== 40 || e.keyCode !== 37 || e.keyCode !== 39){
                      // do something
                     };
                  }
                  

                  【讨论】:

                    【解决方案18】:

                    我相信最新的方法是:

                    document.addEventListener("keydown", function(event) {
                      event.preventDefault();
                      const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
                      switch (key) { // change to event.key to key to use the above variable
                        case "ArrowLeft":
                          // Left pressed
                          <do something>
                          break;
                        case "ArrowRight":
                          // Right pressed
                          <do something>
                          break;
                        case "ArrowUp":
                          // Up pressed
                          <do something>
                          break;
                        case "ArrowDown":
                          // Down pressed
                          <do something>
                          break;
                      }
                    });
                    

                    这假定开发人员希望代码在页面上的任何位置都处于活动状态,并且客户端应该忽略任何其他按键。消除 event.preventDefault();如果按键(包括由此处理程序捕获的按键)仍应处于活动状态,则行。

                    【讨论】:

                      【解决方案19】:

                      如果你使用jquery那么你也可以这样做,

                       $(document).on("keydown", '.class_name', function (event) {
                          if (event.keyCode == 37) {
                              console.log('left arrow pressed');
                          }
                          if (event.keyCode == 38) {
                              console.log('up arrow pressed');
                          }
                          if (event.keyCode == 39) {
                              console.log('right arrow pressed');
                          }
                          if (event.keyCode == 40) {
                              console.log('down arrow pressed');
                          }
                       });
                      

                      【讨论】:

                        【解决方案20】:

                        keyup

                        触发箭头键
                        $(document).on("keyup", "body", function(e) {
                         if (e.keyCode == 38) {
                            // up arrow
                            console.log("up arrow")
                          }
                          if (e.keyCode == 40) {
                              // down arrow
                              console.log("down arrow")
                          }
                          if (e.keyCode == 37) {
                            // left arrow
                            console.log("lefy arrow")
                          }
                          if (e.keyCode == 39) {
                            // right arrow
                            console.log("right arrow")
                          }
                        })
                        

                        onkeydown 允许 ctrl、alt、shits

                        onkeyup 允许制表符、向上箭头、向下箭头、向左箭头、向下箭头

                        【讨论】:

                          【解决方案21】:

                          使用 key 和 ES6。

                          这为每个箭头键提供了一个单独的功能,而无需使用开关,并且还可以在NumLock 开启时与数字键盘中的 2、4、6、8 键一起使用。

                          const element = document.querySelector("textarea"),
                            ArrowRight = k => {
                              console.log(k);
                            },
                            ArrowLeft = k => {
                              console.log(k);
                            },
                            ArrowUp = k => {
                              console.log(k);
                            },
                            ArrowDown = k => {
                              console.log(k);
                            },
                            handler = {
                              ArrowRight,
                              ArrowLeft,
                              ArrowUp,
                              ArrowDown
                            };
                          
                          element.addEventListener("keydown", e => {
                            const k = e.key;
                          
                            if (handler.hasOwnProperty(k)) {
                              handler[k](k);
                            }
                          });
                          <p>Click the textarea then try the arrows</p>
                          <textarea></textarea>

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2015-07-14
                            • 2016-11-11
                            • 2014-09-03
                            • 2022-01-12
                            • 1970-01-01
                            相关资源
                            最近更新 更多