【问题标题】:jQuery Event Keypress: Which key was pressed?jQuery Event Keypress:按下了哪个键?
【发布时间】:2010-09-23 01:27:10
【问题描述】:

使用 jQuery,当我绑定到 keypress 事件时,如何找出按下了哪个键?

$('#searchbox input').bind('keypress', function(e) {});

我想在按下 ENTER 时触发提交。

[更新]

尽管我自己找到了(或更好的:一个)答案,但似乎还有一些变化的空间;)

keyCodewhich 之间有区别吗?尤其是如果我只是在寻找 ENTER,它永远不会是 unicode 键?

是否某些浏览器提供一种属性而其他浏览器提供另一种?

【问题讨论】:

  • ** 如果有人从 Google 获得了这个(就像我一样),请知道“keyup”而不是“keypress”在 Firefox、IE 和 Chrome 中有效。 “keypress”显然只适用于 Firefox。
  • 另外,“keydown”比“keyup”更适合在按下键后触发事件(显然),但是如果您说想要在 SECOND 退格键上触发事件,这一点很重要,如果文本区域为空
  • 至于 e.keyCode VS e.which... 根据我的测试,Chrome 和 IE8:keypress() 处理程序只会触发普通字符(即不是 Up/Down/Ctrl), e.keyCode 和 e.which 都将返回 ASCII 码。然而,在 Firefox 中,所有键都会触发 keypress(),但是:对于普通字符 e.which 将返回 ASCII 码,e.keyCode 将返回 0,对于特殊字符(例如 Up/Down/Ctrl),e.keyCode 将返回键盘代码,e.which 将返回 0。多么有趣。
  • 警告:不要使用谷歌代码中的那个。 jquery 的作者提交了一个补丁,该补丁仅在 github 存储库(以及 John Resig 的分支)上:github.com/tzuryby/jquery.hotkeys。将多个键事件绑定到同一个 dom 节点时,来自 google 代码的一个行为异常。新的解决了它。
  • "keyup" 会很晚才被触发,例如长按某个键。看到这里jsbin.com/aquxit/3/edit所以keydown是要走的路

标签: javascript jquery events bind keypress


【解决方案1】:

其实这样更好:

 var code = e.keyCode || e.which;
 if(code == 13) { //Enter keycode
   //Do something
 }

【讨论】:

  • 如果 ((e.keyCode || e.which) == 13) ? ;)
  • 根据本页下方的评论,jQuery 进行规范化,以便每次都在事件对象上定义“哪个”。所以,检查“keyCode”应该是不必要的。
【解决方案2】:

试试这个

$('#searchbox input').bind('keypress', function(e) {
    if(e.keyCode==13){
        // Enter pressed... do anything here...
    }
});

【讨论】:

  • @VladimirPrudnikov 哦,哦,啊啊啊!啊!在那个链接处到处都是mac——人性!!!
  • 好吧,我们也推出了带有 Windows 应用程序的新版本.. 看看snippets.me
  • @VladimirPrudnikov linux 版本怎么样?
  • @Arda 我们没有 Linux 版本的计划。将会有一个网络应用程序和一个公共 API,所以,可能有人会创建它:)
  • 哈哈哈,一个开发者工具,没有linux的打算。有钱!
【解决方案3】:

如果您使用的是 jQuery UI,您可以翻译常用键码。在ui/ui/ui.core.js:

$.ui.keyCode = { 
    ...
    ENTER: 13, 
    ...
};

tests/simulate/jquery.simulate.js 中也有一些翻译,但我在核心 JS 库中找不到任何翻译。请注意,我只是grep'ed来源。也许还有其他方法可以摆脱这些神奇的数字。

你也可以使用 String.charCodeAt 和 .fromCharCode:

>>> String.charCodeAt('\r') == 13
true
>>> String.fromCharCode(13) == '\r'
true

【讨论】:

  • 更正它是 *$.ui.keyCode.ENTER** 而不是 *$.keyCode.ENTER - 确实像一个魅力,虽然谢谢提示!
  • Uncaught TypeError: String.charCodeAt is not a function 我想你的意思是'\r'.charCodeAt(0) == 13
【解决方案4】:

鉴于您使用的是 jQuery,您绝对应该使用 .which。是的,不同的浏览器设置了不同的属性,但是 jQuery 会对它们进行规范化并在每种情况下设置 .which 值。请参阅http://api.jquery.com/keydown/ 的文档,它指出:

要确定按下了哪个键,我们可以检查传递给处理函数的事件对象。虽然浏览器使用不同的属性来存储这些信息,但 jQuery 对 .which 属性进行了规范化,因此我们可以可靠地使用它来检索关键代码。

【讨论】:

  • 从我所看到的使用 event.which 并尝试与 $.ui.keyCode 进行比较会导致不确定的行为。特别是映射到 $.ui.keyCode.NUMPAD_ENTER 的小写 [L] 键。可爱。
  • 您有演示此错误的重现吗?最好向 jQuery 的所有者报告这一点,而不是尝试重新实现他们的工作。
【解决方案5】:

...此示例阻止表单提交(通常是捕获击键 #13 时的基本意图):

$('input#search').keypress(function(e) {
  if (e.which == '13') {
     e.preventDefault();
     doSomethingWith(this.value);
   }
});

【讨论】:

    【解决方案6】:
     // in jquery source code...
     if (!event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode)) {
         event.which = event.charCode || event.keyCode;
     }
    
     // So you have just to use
     $('#searchbox input').bind('keypress', function(e) {
         if (e.which === 13) {
             alert('ENTER WAS PRESSED');
         }
     });
    

    【讨论】:

    • 这才是真正的答案。接受的键适用于某些键(如 enter),但对其他键无效(如 supr 会被 . 误认为。)
    • 这是来自 jQuery 源代码的直接粘贴,是 jQuery 用来规范化 .which 事件属性的代码。
    • @Ian Clelland:我不明白你的意思,这行得通吗!?大声笑
    • 它确实有效;我很确定,因为 jQuery 使用的正是该代码 :) 如果您已经有 jQuery 可用,那么就使用它——您不需要在自己的代码中使用它。
    • @aSeptik:问题是“我有 jQuery;我如何才能按下按键”——您的回答首先显示了 jQuery 是如何获得它的。我的观点是,由于 jQuery 已经包含这行代码,他不需要它。他可以使用event.which
    【解决方案7】:

    编辑:这仅适用于 IE...

    我知道这是一篇旧帖子,但有人可能会觉得这很有用。

    键事件是映射的,所以除了使用键码值,您还可以使用键值使其更具可读性。

    $(document).ready( function() {
        $('#searchbox input').keydown(function(e)
        {
         setTimeout(function ()
         { 
           //rather than using keyup, you can use keydown to capture 
           //the input as it's being typed.
           //You may need to use a timeout in order to allow the input to be updated
         }, 5);
        }); 
        if(e.key == "Enter")
        {
           //Enter key was pressed, do stuff
        }else if(e.key == "Spacebar")
        {
           //Spacebar was pressed, do stuff
        }
    });
    

    这是我从blog 获得的带有映射键的备忘单

    【讨论】:

    • 没有e.key 属性。
    • 嗯,它看起来像是 IE 特定的属性。它适用于我在 IE 中的应用,但不适用于 Chrome。猜猜我正在使用密钥代码。
    【解决方案8】:

    查看支持组合键的优秀jquery.hotkeys plugin

    $(document).bind('keydown', 'ctrl+c', fn);
    

    【讨论】:

      【解决方案9】:

      这几乎是完整的 keyCode 列表:

      3: "break",
      8: "backspace / delete",
      9: "tab",
      12: 'clear',
      13: "enter",
      16: "shift",
      17: "ctrl",
      18: "alt",
      19: "pause/break",
      20: "caps lock",
      27: "escape",
      28: "conversion",
      29: "non-conversion",
      32: "spacebar",
      33: "page up",
      34: "page down",
      35: "end",
      36: "home ",
      37: "left arrow ",
      38: "up arrow ",
      39: "right arrow",
      40: "down arrow ",
      41: "select",
      42: "print",
      43: "execute",
      44: "Print Screen",
      45: "insert ",
      46: "delete",
      48: "0",
      49: "1",
      50: "2",
      51: "3",
      52: "4",
      53: "5",
      54: "6",
      55: "7",
      56: "8",
      57: "9",
      58: ":",
      59: "semicolon (firefox), equals",
      60: "<",
      61: "equals (firefox)",
      63: "ß",
      64: "@ (firefox)",
      65: "a",
      66: "b",
      67: "c",
      68: "d",
      69: "e",
      70: "f",
      71: "g",
      72: "h",
      73: "i",
      74: "j",
      75: "k",
      76: "l",
      77: "m",
      78: "n",
      79: "o",
      80: "p",
      81: "q",
      82: "r",
      83: "s",
      84: "t",
      85: "u",
      86: "v",
      87: "w",
      88: "x",
      89: "y",
      90: "z",
      91: "Windows Key / Left ⌘ / Chromebook Search key",
      92: "right window key ",
      93: "Windows Menu / Right ⌘",
      96: "numpad 0 ",
      97: "numpad 1 ",
      98: "numpad 2 ",
      99: "numpad 3 ",
      100: "numpad 4 ",
      101: "numpad 5 ",
      102: "numpad 6 ",
      103: "numpad 7 ",
      104: "numpad 8 ",
      105: "numpad 9 ",
      106: "multiply ",
      107: "add",
      108: "numpad period (firefox)",
      109: "subtract ",
      110: "decimal point",
      111: "divide ",
      112: "f1 ",
      113: "f2 ",
      114: "f3 ",
      115: "f4 ",
      116: "f5 ",
      117: "f6 ",
      118: "f7 ",
      119: "f8 ",
      120: "f9 ",
      121: "f10",
      122: "f11",
      123: "f12",
      124: "f13",
      125: "f14",
      126: "f15",
      127: "f16",
      128: "f17",
      129: "f18",
      130: "f19",
      131: "f20",
      132: "f21",
      133: "f22",
      134: "f23",
      135: "f24",
      144: "num lock ",
      145: "scroll lock",
      160: "^",
      161: '!',
      163: "#",
      164: '$',
      165: 'ù',
      166: "page backward",
      167: "page forward",
      169: "closing paren (AZERTY)",
      170: '*',
      171: "~ + * key",
      173: "minus (firefox), mute/unmute",
      174: "decrease volume level",
      175: "increase volume level",
      176: "next",
      177: "previous",
      178: "stop",
      179: "play/pause",
      180: "e-mail",
      181: "mute/unmute (firefox)",
      182: "decrease volume level (firefox)",
      183: "increase volume level (firefox)",
      186: "semi-colon / ñ",
      187: "equal sign ",
      188: "comma",
      189: "dash ",
      190: "period ",
      191: "forward slash / ç",
      192: "grave accent / ñ / æ",
      193: "?, / or °",
      194: "numpad period (chrome)",
      219: "open bracket ",
      220: "back slash ",
      221: "close bracket / å",
      222: "single quote / ø",
      223: "`",
      224: "left or right ⌘ key (firefox)",
      225: "altgr",
      226: "< /git >",
      230: "GNOME Compose Key",
      231: "ç",
      233: "XF86Forward",
      234: "XF86Back",
      240: "alphanumeric",
      242: "hiragana/katakana",
      243: "half-width/full-width",
      244: "kanji",
      255: "toggle touchpad"
      

      【讨论】:

        【解决方案10】:
        $(document).ready(function(){
            $("#btnSubmit").bind("click",function(){$('#'+'<%=btnUpload.ClientID %>').trigger("click");return false;});
            $("body, input, textarea").keypress(function(e){
                if(e.which==13) $("#btnSubmit").click();
            });
        });
        

        希望对你有帮助!!!

        【讨论】:

          【解决方案11】:

          这里是对各种浏览器行为的详细描述http://unixpapa.com/js/key.html

          【讨论】:

          • 这绝对是每个挣扎着提供绝望答案的人都应该阅读的页面。
          【解决方案12】:

          好吧,我瞎了:

          e.which
          

          将包含密钥的 ASCII 码。

          https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/which

          【讨论】:

            【解决方案13】:

            我将用这行e.preventDefault(); 来补充解决方案代码。 如果是表单的输入字段,我们不会在按下输入时提交

            var code = (e.keyCode ? e.keyCode : e.which);
             if(code == 13) { //Enter keycode
               e.preventDefault();
               //Do something
             }
            

            【讨论】:

              【解决方案14】:

              使用 event.key 和现代 JS!

              没有数字代码了。您可以直接检查密钥。例如"Enter""LeftArrow""r""R"

              const input = document.getElementById("searchbox");
              input.addEventListener("keypress", function onEvent(event) {
                  if (event.key === "Enter") {
                      // Submit
                  }
                  else if (event.key === "Q") {
                      // Play quacking duck sound, maybe...
                  }
              });
              

              Mozilla Docs

              Supported Browsers

              【讨论】:

                【解决方案15】:

                添加隐藏提交,而不是隐藏类型,只需使用 style="display:none" 进行简单提交。这是一个示例(从代码中删除了不必要的属性)。

                <form>
                  <input type="text">
                  <input type="submit" style="display:none">
                </form>
                

                它将接受原生输入键,无需 JavaScript,适用于所有浏览器。

                【讨论】:

                  【解决方案16】:

                  这是一个 jquery 扩展,它将处理被按下的回车键。

                  (function ($) {
                      $.prototype.enterPressed = function (fn) {
                          $(this).keyup(function (e) {
                              if ((e.keyCode || e.which) == 13) {
                                  fn();
                              }
                          });
                      };
                  }(jQuery || {}));
                  
                  $("#myInput").enterPressed(function() {
                      //do something
                  });
                  

                  可以在这里找到一个工作示例 http://jsfiddle.net/EnjB3/8/

                  【讨论】:

                    【解决方案17】:

                    女巫 ;)

                    /*
                    This code is for example. In real life you have plugins like :
                    https://code.google.com/p/jquery-utils/wiki/JqueryUtils
                    https://github.com/jeresig/jquery.hotkeys/blob/master/jquery.hotkeys.js
                    https://github.com/madrobby/keymaster
                    http://dmauro.github.io/Keypress/
                    
                    http://api.jquery.com/keydown/
                    http://api.jquery.com/keypress/
                    */
                    
                    var event2key = {'97':'a', '98':'b', '99':'c', '100':'d', '101':'e', '102':'f', '103':'g', '104':'h', '105':'i', '106':'j', '107':'k', '108':'l', '109':'m', '110':'n', '111':'o', '112':'p', '113':'q', '114':'r', '115':'s', '116':'t', '117':'u', '118':'v', '119':'w', '120':'x', '121':'y', '122':'z', '37':'left', '39':'right', '38':'up', '40':'down', '13':'enter'};
                    
                    var documentKeys = function(event) {
                        console.log(event.type, event.which, event.keyCode);
                    
                        var keycode = event.which || event.keyCode; // par exemple : 112
                        var myKey = event2key[keycode]; // par exemple : 'p'
                    
                        switch (myKey) {
                            case 'a':
                                $('div').css({
                                    left: '+=50'
                                });
                                break;
                            case 'z':
                                $('div').css({
                                    left: '-=50'
                                });
                                break;
                            default:
                                //console.log('keycode', keycode);
                        }
                    };
                    
                    $(document).on('keydown keyup keypress', documentKeys);
                    

                    演示:http://jsfiddle.net/molokoloco/hgXyq/24/

                    【讨论】:

                      【解决方案18】:
                      $(document).bind('keypress', function (e) {
                          console.log(e.which);  //or alert(e.which);
                      
                      });
                      

                      你应该有 firbug 才能在控制台中看到结果

                      【讨论】:

                        【解决方案19】:

                        有些浏览器使用keyCode,有些使用keyCode。如果您使用 jQuery,您可以可靠地使用 which 作为 jQuery 标准化的东西。其实,

                        $('#searchbox input').bind('keypress', function(e) {
                            if(e.keyCode==13){
                        
                            }
                        });
                        

                        【讨论】:

                          【解决方案20】:

                          根据 Kilian 的回答:

                          如果只输入按键很重要:

                          <form action="javascript:alert('Enter');">
                          <input type=text value="press enter">
                          </form>
                          

                          【讨论】:

                            【解决方案21】:

                            我做的最简单的方法是:

                            $("#element").keydown(function(event) {
                                if (event.keyCode == 13) {
                                    localiza_cep(this.value);
                                }
                            });
                            

                            【讨论】:

                            • 最好使用event.which 而不是event.keyCode。来自jQuery APIThe event.which property normalizes event.keyCode and event.charCode. It is recommended to watch event.which for keyboard key input.
                            【解决方案22】:

                            我刚刚为 jQuery 制作了一个插件,它允许更轻松的keypress 事件。无需找到号码并输入,您所要做的就是:

                            如何使用

                            1. 在下面包含我的代码
                            2. 运行此代码:
                            $(document).keydown(function(e) {
                                if (getPressedKey(e) == theKeyYouWantToFireAPressEventFor /*Add 'e.ctrlKey here to only fire if the combo is CTRL+theKeyYouWantToFireAPressEventFor'*/) {
                                    // Your Code To Fire When You Press theKeyYouWantToFireAPressEventFor 
                                }
                            });
                            

                            就这么简单。请注意,theKeyYouWantToFireAPressEventFor 不是一个数字,而是一个字符串(例如,"a"A 被按下时触发,"ctrl"CTRL 时触发(control) 被按下,或者,在数字的情况下,只是1,没有引号。当按下 1 时会触发。)

                            示例/代码:

                            function getPressedKey(e){var a,s=e.keyCode||e.which,c=65,r=66,o=67,l=68,t=69,f=70,n=71,d=72,i=73,p=74,u=75,h=76,m=77,w=78,k=79,g=80,b=81,v=82,q=83,y=84,j=85,x=86,z=87,C=88,K=89,P=90,A=32,B=17,D=8,E=13,F=16,G=18,H=19,I=20,J=27,L=33,M=34,N=35,O=36,Q=37,R=38,S=40,T=45,U=46,V=91,W=92,X=93,Y=48,Z=49,$=50,_=51,ea=52,aa=53,sa=54,ca=55,ra=56,oa=57,la=96,ta=97,fa=98,na=99,da=100,ia=101,pa=102,ua=103,ha=104,ma=105,wa=106,ka=107,ga=109,ba=110,va=111,qa=112,ya=113,ja=114,xa=115,za=116,Ca=117,Ka=118,Pa=119,Aa=120,Ba=121,Da=122,Ea=123,Fa=114,Ga=145,Ha=186,Ia=187,Ja=188,La=189,Ma=190,Na=191,Oa=192,Qa=219,Ra=220,Sa=221,Ta=222;return s==Fa&&(a="numlock"),s==Ga&&(a="scrolllock"),s==Ha&&(a="semicolon"),s==Ia&&(a="equals"),s==Ja&&(a="comma"),s==La&&(a="dash"),s==Ma&&(a="period"),s==Na&&(a="slash"),s==Oa&&(a="grave"),s==Qa&&(a="openbracket"),s==Ra&&(a="backslash"),s==Sa&&(a="closebracket"),s==Ta&&(a="singlequote"),s==B&&(a="ctrl"),s==D&&(a="backspace"),s==E&&(a="enter"),s==F&&(a="shift"),s==G&&(a="alt"),s==H&&(a="pause"),s==I&&(a="caps"),s==J&&(a="esc"),s==L&&(a="pageup"),s==M&&(a="padedown"),s==N&&(a="end"),s==O&&(a="home"),s==Q&&(a="leftarrow"),s==R&&(a="uparrow"),s==S&&(a="downarrow"),s==T&&(a="insert"),s==U&&(a="delete"),s==V&&(a="winleft"),s==W&&(a="winright"),s==X&&(a="select"),s==Z&&(a=1),s==$&&(a=2),s==_&&(a=3),s==ea&&(a=4),s==aa&&(a=5),s==sa&&(a=6),s==ca&&(a=7),s==ra&&(a=8),s==oa&&(a=9),s==Y&&(a=0),s==ta&&(a=1),s==fa&&(a=2),s==na&&(a=3),s==da&&(a=4),s==ia&&(a=5),s==pa&&(a=6),s==ua&&(a=7),s==ha&&(a=8),s==ma&&(a=9),s==la&&(a=0),s==wa&&(a="times"),s==ka&&(a="add"),s==ga&&(a="minus"),s==ba&&(a="decimal"),s==va&&(a="devide"),s==qa&&(a="f1"),s==ya&&(a="f2"),s==ja&&(a="f3"),s==xa&&(a="f4"),s==za&&(a="f5"),s==Ca&&(a="f6"),s==Ka&&(a="f7"),s==Pa&&(a="f8"),s==Aa&&(a="f9"),s==Ba&&(a="f10"),s==Da&&(a="f11"),s==Ea&&(a="f12"),s==c&&(a="a"),s==r&&(a="b"),s==o&&(a="c"),s==l&&(a="d"),s==t&&(a="e"),s==f&&(a="f"),s==n&&(a="g"),s==d&&(a="h"),s==i&&(a="i"),s==p&&(a="j"),s==u&&(a="k"),s==h&&(a="l"),s==m&&(a="m"),s==w&&(a="n"),s==k&&(a="o"),s==g&&(a="p"),s==b&&(a="q"),s==v&&(a="r"),s==q&&(a="s"),s==y&&(a="t"),s==j&&(a="u"),s==x&&(a="v"),s==z&&(a="w"),s==C&&(a="x"),s==K&&(a="y"),s==P&&(a="z"),s==A&&(a="space"),a}
                            
                            $(document).keydown(function(e) {
                              $("#key").text(getPressedKey(e));
                              console.log(getPressedKey(e));
                              if (getPressedKey(e)=="space") {
                                e.preventDefault();
                              }
                              if (getPressedKey(e)=="backspace") {
                                e.preventDefault();
                              }
                            });
                            <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
                            <p>The Pressed Key: <span id=key></span></p>

                            因为长版太……嗯……太长了,我给它做了一个PasteBin链接:
                            http://pastebin.com/VUaDevz1

                            【讨论】:

                            • 如果您不使用数百万个“if”比较,您可以使函数更短更快 -> jsfiddle.net/BlaM/bcguctrx - 还要注意 - 例如 - openbracket 和 closebracket 未打开/德语键盘上的右括号`。
                            • 我喜欢这个解决方案。不错。
                            【解决方案23】:

                            event.keyCodeevent.which 已弃用。请参阅上面的@Gibolt 答案或查看文档:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

                            应该改用event.key

                            keypress 事件也被弃用: https://developer.mozilla.org/en-US/docs/Web/API/Document/keypress_event

                            【讨论】:

                              【解决方案24】:

                              试试这个:

                              jQuery('#myInput').keypress(function(e) {
                                  code = e.keyCode ? e.keyCode : e.which;
                                  if(code.toString() == 13) {
                                      alert('You pressed enter!');
                                  }
                              });
                              

                              【讨论】:

                                猜你喜欢
                                • 2013-09-23
                                • 1970-01-01
                                • 2016-01-31
                                • 2015-03-29
                                • 2010-11-02
                                • 1970-01-01
                                • 1970-01-01
                                • 2016-03-13
                                相关资源
                                最近更新 更多