jQuery Event Keypress: มีการกดคีย์ใด


706

ด้วย jQuery ฉันจะทราบได้อย่างไรว่าจะกดคีย์ใดเมื่อฉันเชื่อมโยงกับเหตุการณ์แป้นกด

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

ฉันต้องการเปิดใช้งานการส่งเมื่อENTERกด

[Update]

แม้ว่าฉันจะพบ (หรือดีกว่า: หนึ่ง) ตอบตัวเองดูเหมือนว่าจะมีห้องสำหรับการเปลี่ยนแปลงบางอย่าง;)

มีความแตกต่างระหว่างkeyCodeและwhich- โดยเฉพาะถ้าฉันแค่มองหาENTERซึ่งจะไม่เป็นคีย์ unicode?

เบราว์เซอร์บางตัวมีคุณสมบัติหนึ่งรายการและอื่น ๆ มีอีกคุณสมบัติหนึ่งหรือไม่


295
** หากใครได้รับสิ่งนี้จาก Google (เช่นเดียวกับฉัน) รู้ว่า "keyup" แทน "keypress" ทำงานได้ใน Firefox, IE และ Chrome "keypress" เห็นได้ชัดว่าใช้งานได้เฉพาะใน Firefox
Tyler

17
นอกจากนี้ "keydown" ทำงานได้ดีกว่า "keyup" สำหรับเรียกเหตุการณ์หลังจากกดปุ่ม (ชัด) แต่นี่เป็นสิ่งสำคัญถ้าคุณบอกว่าต้องการเปิดใช้งานเหตุการณ์บน Backspace SECOND ถ้าข้อความว่างเปล่า
Tyler

12
สำหรับ e.keyCode VS e.which ... จากการทดสอบของฉัน Chrome และ IE8: ตัวจัดการปุ่มกด () จะได้รับการทริกเกอร์สำหรับอักขระปกติเท่านั้น (เช่นไม่ใช่ขึ้น / ลง / Ctrl) และทั้ง e.keyCode และ e ซึ่งจะส่งคืนรหัส ASCII ใน Firefox อย่างไรก็ตามคีย์ทั้งหมดจะเปิดใช้งานการกดปุ่ม (), BUT: สำหรับอักขระปกติ e.which จะส่งคืนรหัส ASCII และ e.keyCode จะส่งกลับ 0 และสำหรับอักขระพิเศษ (เช่นขึ้น / ลง / Ctrl) e.keyCode จะกลับมา รหัสแป้นพิมพ์และ e. ซึ่งจะส่งคืน 0 วิธีสนุก
jackocnr

4
คำเตือน: อย่าใช้จาก Google Code ผู้เขียน jQuery ยื่นแพทช์ที่เป็นเฉพาะในพื้นที่เก็บข้อมูล GitHub (และส้อมจอห์นเรซิกเช่นกัน): github.com/tzuryby/jquery.hotkeys รหัสจาก google code ทำงานผิดพลาดเมื่อเชื่อมโยงเหตุการณ์สำคัญมากกว่าหนึ่งเหตุการณ์กับโหนด dom เดียวกัน ใหม่แก้มัน
Daniel Ribeiro

4
"keyup" จะเริ่มทำงานช้ามากเมื่อคุณกดปุ่มเป็นเวลานาน ดูที่นี่jsbin.com/aquxit/3/editดังนั้น keydown คือหนทางที่จะไป
Toskan

คำตอบ:


844

จริง ๆ แล้วสิ่งนี้ดีกว่า:

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

84
ถ้า ((e.keyCode || e.which) == 13)? ;)
Kezzer

49
จากความคิดเห็นที่เพิ่มเติมลงไปในหน้านี้ jQuery จะทำ normalizes ดังนั้น 'ซึ่ง' ถูกกำหนดบนวัตถุเหตุการณ์ทุกครั้ง ดังนั้นการตรวจสอบ 'keyCode' จึงไม่จำเป็น
Ztyx

197
ทำไม upvote มหาศาลถึงต้องนับ? คำถามเกี่ยวกับ jQuery ซึ่งทำให้ข้อมูลนี้เป็นมาตรฐานดังนั้นจึงไม่จำเป็นต้องใช้สิ่งอื่นนอกจากe.whichเหตุการณ์ใดก็ตามที่คุณใช้
Tim Down

48
@Tim: อนิจจาฉันเพิ่งทดสอบกับ Firefox โดยใช้api.jquery.com/keypress : เมื่อฉันกด <Tab> e.whichไม่ได้ตั้งค่า (ยังคงอยู่0) แต่e.keyCodeเป็น ( 9) ดูstackoverflow.com/questions/4793233/…ทำไมเรื่องนี้ถึงสำคัญ
Marcel Korpel

3
@Marcel: ใช่การจัดการคีย์ของ jQuery มีข้อบกพร่องและเป็นตัวอย่างที่โชคร้าย แต่สำหรับคีย์ Enter ซึ่งเป็นสิ่งที่คำถามนี้ถามเกี่ยวกับสถานการณ์เป็นเรื่องง่ายมาก
Tim Down

133

ลองสิ่งนี้

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

5
@VladimirPrudnikov โอ้ววว Ahhhh! อ่า! มี eveywhere ของ mac ที่ลิงค์นั้น - มนุษยชาติ !!!
Ben DeMott

1
เราก็เปิดตัวเวอร์ชั่นใหม่พร้อมแอพ Windows ด้วย .. ลองดูsnippets.me
Vladimir Prudnikov

2
@VladimirPrudnikov แล้วรุ่นลินุกซ์ล่ะ?
Arda

@Arda เราไม่มีแผนสำหรับรุ่น linux จะมี app เว็บและประชาชน API ดังนั้นอาจจะเป็นคนที่จะสร้างมันขึ้นมา :)
วลาดิเมีย Prudnikov

1
ฮ่าฮ่าฮ่าเครื่องมือสำหรับนักพัฒนาที่ไม่มีแผนสำหรับลินุกซ์ ที่อุดมไปด้วย!
Ziggy

61

หากคุณใช้ jQuery UI คุณจะต้องแปลรหัสคีย์ทั่วไป ในui / ui / ui.core.js :

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

นอกจากนี้ยังมีการแปลบางอย่างในการทดสอบ / จำลอง / jquery.simulate.js แต่ฉันไม่พบสิ่งใดในไลบรารี JS หลัก โปรดทราบฉันเพียงแค่ grep'ed แหล่งที่มา อาจมีวิธีอื่นในการกำจัดตัวเลขเวทย์มนตร์เหล่านี้

คุณยังสามารถใช้ประโยชน์จาก String.charCodeAt และ. fromCharCode:

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

13
การแก้ไขมันคือ* $. ui.keyCode.ENTER ** ไม่ใช่ * $. keyCode.ENTER - ใช้งานได้อย่างมีเสน่ห์ แต่ขอบคุณสำหรับคำแนะนำ!
daniellmb

Uncaught TypeError: String.charCodeAt is not a functionฉันคิดว่าคุณตั้งใจจะพูด'\r'.charCodeAt(0) == 13
Patrick Roberts

39

ระบุว่าคุณกำลังใช้ jQuery คุณควรใช้อย่างแน่นอน ใช่เบราว์เซอร์ที่แตกต่างกันตั้งค่าคุณสมบัติที่แตกต่างกัน แต่ jQuery จะทำให้เป็นมาตรฐานและตั้งค่า. ซึ่งในแต่ละกรณี ดูเอกสารที่http://api.jquery.com/keydown/รัฐ:

เพื่อตรวจสอบว่ามีการกดปุ่มใดเราสามารถตรวจสอบวัตถุเหตุการณ์ที่ส่งผ่านไปยังฟังก์ชันตัวจัดการ ในขณะที่เบราว์เซอร์ใช้คุณสมบัติที่แตกต่างกันในการจัดเก็บข้อมูลนี้ jQuery จะปรับคุณสมบัติของ. ให้เป็นมาตรฐานเพื่อให้เราสามารถใช้เพื่อดึงรหัสคีย์


2
จากสิ่งที่ฉันเห็นโดยใช้ event.which และพยายามเปรียบเทียบกับผลลัพธ์ที่ไม่แน่นอน $ .ui.keyCode โดยเฉพาะคีย์ [L] ตัวพิมพ์เล็กซึ่งแม็พกับ $ .ui.keyCode.NUMPAD_ENTER น่ารัก
Danny

4
คุณมีภาพจำลองที่แสดงข้อผิดพลาดนี้หรือไม่? การรายงานสิ่งนี้ให้เจ้าของ jQuery ดีกว่าพยายามนำงานของพวกเขากลับมาใช้ใหม่
Frank Schwieterman

31

... ตัวอย่างนี้ป้องกันการส่งแบบฟอร์ม (ความตั้งใจพื้นฐานเป็นประจำเมื่อจับการกดแป้นพิมพ์ # 13):

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

28

แก้ไข: ใช้งานได้กับ 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
    }
});

นี่คือสูตรโกงที่มีปุ่มแมปที่ฉันได้รับจากบล็อกนี้ ป้อนคำอธิบายรูปภาพที่นี่


5
ไม่มีe.keyทรัพย์สิน
SLaks

3
อืมดูเหมือนว่าเป็นคุณสมบัติเฉพาะของ IE ใช้งานได้กับแอปของฉันใน IE แต่ไม่ใช่ Chrome เดาฉันใช้รหัส
เควิน

28
 // 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');
     }
 });

1
นี่คือคำตอบที่แท้จริง ผู้ที่ได้รับการยอมรับจะใช้งานได้กับกุญแจบางส่วน (เช่นใส่) แต่จะล้มเหลวสำหรับผู้อื่น (เช่นผู้ที่จะถูกเข้าใจผิดโดย a)
Oscar Foley

19
นี่คือการวางโดยตรงจากแหล่ง jQuery และเป็นรหัสที่ jQuery ใช้ในการทำให้ปกติคุณสมบัติเหตุการณ์. ซึ่ง
Ian Clelland

@Ian Clelland: ฉันไม่เข้าใจประเด็นของคุณมันใช้งานได้ใช่มั้ย! lol
Luca Filosofi

13
มันใช้งานได้ ฉันแน่ใจเพราะ jQuery ใช้รหัสนั้นอย่างแน่นอน :) หากคุณมี jQuery อยู่แล้วให้ใช้มัน - คุณไม่จำเป็นต้องมีมันในรหัสของคุณเอง
Ian Clelland

1
@ aSeptik: คำถามคือ "ฉันมี jQuery ฉันจะกดปุ่มได้อย่างไร" - คำตอบของคุณแสดงให้เห็นว่า jQuery ได้รับมันตั้งแต่แรก ประเด็นของฉันคือเนื่องจาก jQuery มีรหัสบรรทัดนี้อยู่แล้วเขาจึงไม่ต้องการมัน event.whichเขาก็สามารถใช้
Ian Clelland


14
$(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();
    });
});

หวังว่านี่อาจช่วยคุณได้ !!!


12

นี่เป็นรายการคีย์โค้ดที่สมบูรณ์มากทีเดียว:

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"


6

นี่คือคำอธิบายโดยละเอียดเกี่ยวกับพฤติกรรมของเบราว์เซอร์ต่างๆhttp://unixpapa.com/js/key.html


2
นี่คือหน้าเว็บที่ทุกคนดิ้นรนเพื่อให้คำตอบที่สิ้นหวังควรอ่าน
ทิมลง

5

ฉันจะเสริมรหัสโซลูชันด้วยบรรทัดe.preventDefault();นี้ ในกรณีที่ช่องป้อนข้อมูลของแบบฟอร์มเราไม่ได้เข้าร่วมเพื่อส่งเมื่อกด

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

4

เพิ่มการส่งที่ซ่อนอยู่, ไม่ใช่การพิมพ์ที่ถูกซ่อน, เพียงแค่ส่งธรรมดาพร้อม style = "display: none" นี่คือตัวอย่าง (ลบแอตทริบิวต์ที่ไม่จำเป็นออกจากรหัส)

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

มันจะยอมรับการป้อนรหัสโดยกำเนิดไม่จำเป็นต้องใช้ JavaScript ทำงานได้ในทุกเบราว์เซอร์


4

ต่อไปนี้เป็นส่วนขยาย jquery ที่จะจัดการกับปุ่ม Enter ที่ถูกกด

(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/


4

แม่มด;)

/*
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/


4

ใช้งาน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

เบราว์เซอร์ที่รองรับ



3

เบราว์เซอร์บางตัวใช้ keyCode และอื่น ๆ ใช้ หากคุณใช้ jQuery คุณสามารถใช้สิ่งที่เป็นมาตรฐาน jQuery ได้อย่างน่าเชื่อถือ อันที่จริงแล้ว

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

    }
});

2

ตามคำตอบของ Kilian:

หากป้อนเฉพาะการกดปุ่มเป็นสิ่งสำคัญ:

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

2

วิธีที่ง่ายที่สุดที่ฉันทำคือ:

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

1
มันจะดีกว่าที่จะใช้แทนevent.which event.keyCodeจากjQuery API :The event.which property normalizes event.keyCode and event.charCode. It is recommended to watch event.which for keyboard key input.
zanetu

2

ฉันเพิ่งสร้างปลั๊กอินสำหรับ 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)11ถูกกด.)

ตัวอย่าง / รหัส:

เพราะเวอร์ชั่นยาวนั้นยาวมาก ... นานแล้วฉันได้ทำการเชื่อมโยง PasteBin เพื่อมัน:
http://pastebin.com/VUaDevz1


คุณสามารถทำให้ฟังก์ชั่นสั้นลงและเร็วขึ้นหากคุณไม่ใช้การเปรียบเทียบ "if" -> jsfiddle.net/BlaM/bcguctrx - โปรดทราบว่า - ตัวอย่างเช่น openbracket และ closebracket ไม่ใช่วงเล็บเปิด / ปิด แป้นพิมพ์ภาษาเยอรมัน
BlaM

ฉันชอบวิธีนี้ ดี
Jay


-9

ลองสิ่งนี้:

jQuery('#myInput').keypress(function(e) {
    code = e.keyCode ? e.keyCode : e.which;
    if(code.toString() == 13) {
        alert('You pressed enter!');
    }
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.