Phím bấm sự kiện jQuery: Phím nào được nhấn?


706

Với jQuery, làm cách nào để tìm ra phím nào được nhấn khi tôi liên kết với sự kiện nhấn phím?

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

Tôi muốn kích hoạt một trình khi ENTERđược nhấn.

[Cập nhật]

Mặc dù tôi đã tìm thấy câu trả lời (hoặc tốt hơn: một) cho bản thân mình, nhưng dường như có một số chỗ cho sự thay đổi;)

Có sự khác biệt giữa keyCodewhich- đặc biệt nếu tôi chỉ tìm kiếmENTER , đó sẽ không bao giờ là khóa unicode?

Do một số trình duyệt cung cấp một tài sản và những người khác cung cấp một tài sản khác?


295
** Nếu bất cứ ai đã đạt được điều này từ Google (như tôi đã làm), hãy biết rằng "keyup" thay vì "keypress" hoạt động trong Firefox, IE và Chrome. "nhấn phím" rõ ràng chỉ hoạt động trong Firefox.
Tyler

17
Ngoài ra, "keydown" hoạt động tốt hơn "keyup" để kích hoạt sự kiện SAU KHI phím đã được nhấn (rõ ràng) nhưng điều này rất quan trọng nếu bạn nói muốn kích hoạt một sự kiện trên backspace SECOND nếu một textarea trống
Tyler

12
Đối với e.keyCode VS e.which ... Từ các thử nghiệm của tôi, Chrome và IE8: trình xử lý nhấn phím () sẽ chỉ được kích hoạt cho các ký tự bình thường (không phải Up / Down / Ctrl) và cả e.keyCode và e. sẽ trả về mã ASCII. Tuy nhiên, trong Firefox, tất cả các khóa sẽ kích hoạt phím nhấn (), NHƯNG: đối với các ký tự bình thường, e sẽ trả về mã ASCII và e.keyCode sẽ trả về 0 và cho các ký tự đặc biệt (ví dụ: Lên / Xuống / Ctrl) e.keyCode sẽ trả về mã bàn phím và e.which sẽ trả về 0. Thật vui.
jackocnr

4
Cảnh báo: KHÔNG sử dụng mã từ google code. Tác giả của jquery đã gửi một bản vá, chỉ có trên kho github (và cả ngã ba của John Resig): github.com/tzuryby/jquery.hotkeys . Một từ mã google hoạt động sai khi liên kết nhiều hơn một sự kiện quan trọng vào cùng một nút dom. Cái mới giải quyết nó.
Daniel Ribeiro

4
"keyup" sẽ được kích hoạt rất muộn khi bạn nhấn phím trong một thời gian dài. Xem tại đây jsbin.com/aquxit/3/edit vì vậy keydown là cách để đi
Toskan

Câu trả lời:


844

Trên thực tế điều này là tốt hơn:

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

84
if ((e.keyCode | | e.which) == 13)? ;)
Kezzer

49
Theo một bình luận tiếp theo trên trang này, jQuery bình thường hóa để 'cái đó' được xác định trên đối tượng sự kiện mỗi lần. Vì vậy, việc kiểm tra 'keyCode' là không cần thiết.
Ztyx

197
Tại sao số lượng upvote khổng lồ? Câu hỏi là về jQuery, công cụ này bình thường hóa công cụ này, vì vậy không cần sử dụng bất cứ thứ gì ngoàie.which bất kỳ sự kiện nào bạn đang sử dụng.
Tim Down

48
@Tim: Than ôi, tôi vừa thử nghiệm điều này với Firefox bằng api.jquery.com/keypress : khi tôi nhấn <Tab>, e.whichkhông được đặt (vẫn 0), nhưng e.keyCodelà ( 9). Xem stackoverflow.com/questions/4793233/ cấp tại sao điều này lại quan trọng.
Marcel Korpel

3
@Marcel: Có, việc xử lý khóa của jQuery có những thiếu sót và đó là một ví dụ đáng tiếc, nhưng đối với khóa Enter, đây là điều mà câu hỏi này hỏi về, tình huống cực kỳ đơn giản.
Tim Down

133

Thử cái này

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

5
@VladimirPrudnikov Ôi, ôi, ôi! À! Có những nơi xa xôi của mac ở liên kết đó - nhân loại !!!
Ben DeMott

1
Chà, chúng tôi cũng đã ra mắt phiên bản mới với ứng dụng Windows .. hãy xem đoạn
trích.me

2
@VladimirPrudnikov làm thế nào về một phiên bản linux?
Arda

@Arda chúng tôi không có kế hoạch cho phiên bản linux. Sẽ có một ứng dụng web và API công khai, vì vậy, có thể ai đó sẽ tạo ra nó :)
Vladimir Prudnikov

1
Ha ha ha, một công cụ phát triển không có kế hoạch cho linux. Giàu có!
Ziggy

61

Nếu bạn đang sử dụng jQuery UI, bạn có bản dịch cho các mã khóa phổ biến. Trong ui / ui / ui.core.js :

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

Ngoài ra còn có một số bản dịch trong các bài kiểm tra / mô phỏng / jquery.simulation.js nhưng tôi không thể tìm thấy bất kỳ bản dịch nào trong thư viện JS cốt lõi. Tâm trí bạn, tôi chỉ đơn thuần là lấy nguồn. Có lẽ có một số cách khác để thoát khỏi những con số ma thuật.

Bạn cũng có thể sử dụng String.charCodeAt và .fromCharCode:

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

13
Sửa nó là * $. Ui.keyCode.ENTER ** không * $. KeyCode.ENTER - hoạt động như một bùa mê mặc dù thx cho tiền boa!
daniellmb

Uncaught TypeError: String.charCodeAt is not a functionTôi nghĩ bạn muốn nói'\r'.charCodeAt(0) == 13
Patrick Roberts

39

Cho rằng bạn đang sử dụng jQuery, bạn hoàn toàn nên sử dụng .which. Có các trình duyệt khác nhau đặt các thuộc tính khác nhau, nhưng jQuery sẽ chuẩn hóa chúng và đặt giá trị .which trong mỗi trường hợp. Xem tài liệu tại http://api.jquery.com/keydown/ có ghi:

Để xác định phím nào được nhấn, chúng ta có thể kiểm tra đối tượng sự kiện được truyền cho hàm xử lý. Trong khi các trình duyệt sử dụng các thuộc tính khác nhau để lưu trữ thông tin này, jQuery bình thường hóa thuộc tính .which để chúng tôi có thể sử dụng nó một cách đáng tin cậy để lấy mã khóa.


2
Từ những gì tôi đã thấy khi sử dụng event.which và cố gắng so sánh với $ .ui.keyCode dẫn đến hành vi không chắc chắn. Cụ thể là khóa chữ thường [L] ánh xạ tới $ .ui.keyCode.NUMPAD_ENTER. Dễ thương.
Danny

4
Bạn có một repro chứng minh lỗi này? Tốt nhất là báo cáo điều này với chủ sở hữu của jQuery hơn là cố gắng thực hiện lại công việc của họ.
Frank Schwieterman

31

... ví dụ này ngăn việc gửi biểu mẫu (thường là ý định cơ bản khi chụp tổ hợp phím # 13):

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

28

chỉnh sửa: Điều này chỉ hoạt động cho IE ...

Tôi nhận ra đây là một bài viết cũ, nhưng ai đó có thể thấy điều này hữu ích.

Các sự kiện chính được ánh xạ, vì vậy thay vì sử dụng giá trị mã khóa, bạn cũng có thể sử dụng giá trị khóa để làm cho nó dễ đọc hơn một chút.

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

Đây là một bảng cheat với các khóa được ánh xạ mà tôi nhận được từ blog này nhập mô tả hình ảnh ở đây


5
Không có e.keytài sản.
SLaks

3
Hmm, có vẻ như đó là một tài sản cụ thể của IE. Nó hoạt động cho ứng dụng của tôi trong IE nhưng không phải Chrome. Đoán tôi đang sử dụng mã khóa.
Kevin

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
Đây là câu trả lời thực sự. Cái được chấp nhận sẽ hoạt động cho một số khóa (như enter) nhưng sẽ thất bại với những cái khác (như supr sẽ bị nhầm bởi a.)
Oscar Foley

19
Đây là một dán trực tiếp từ nguồn jQuery và là mã mà jQuery sử dụng để chuẩn hóa thuộc tính sự kiện .which.
Ian Clelland

@Ian Clelland: tôi không thể hiểu quan điểm của bạn, điều này có đúng hay không!? lol
Luca Filosofi

13
Nó không hoạt động; Tôi chắc chắn về điều đó, bởi vì jQuery sử dụng chính xác mã đó :) Nếu bạn đã có sẵn jQuery, thì chỉ cần sử dụng nó - bạn không cần phải có mã này trong mã của riêng mình.
Ian Clelland

1
@aSeptik: Câu hỏi là "Tôi có jQuery; làm cách nào để nhấn phím" - câu trả lời của bạn cho thấy cách jQuery lấy nó ở vị trí đầu tiên. Quan điểm của tôi là vì jQuery đã chứa dòng mã này, nên anh ta không cần nó. Anh ta chỉ có thể sử dụng 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();
    });
});

Hy vọng điều này có thể giúp bạn !!!


12

Đây là khá nhiều danh sách đầy đủ các mã khóa:

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

Dưới đây là mô tả dài về hành vi của các trình duyệt khác nhau http://unixpapa.com/js/key.html


2
Đây hoàn toàn là trang mà mọi người đang loay hoay cung cấp những câu trả lời vô vọng nên đọc.
Tim Down

5

Tôi sẽ chỉ bổ sung mã giải pháp với dòng này e.preventDefault();. Trong trường hợp trường đầu vào của biểu mẫu, chúng tôi không tham dự để gửi vào nhấn

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

4

Thêm gửi ẩn, không gõ ẩn, chỉ cần gửi đơn giản với style = "display: none". Dưới đây là một ví dụ (loại bỏ các thuộc tính không cần thiết khỏi mã).

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

nó sẽ chấp nhận nhập khóa tự nhiên, không cần JavaScript, hoạt động trong mọi trình duyệt.


4

Đây là một phần mở rộng jquery sẽ xử lý phím enter được nhấn.

(function ($) {
    $.prototype.enterPressed = function (fn) {
        $(this).keyup(function (e) {
            if ((e.keyCode || e.which) == 13) {
                fn();
            }
        });
    };
}(jQuery || {}));

$("#myInput").enterPressed(function() {
    //do something
});

Một ví dụ hoạt động có thể được tìm thấy ở đây http://jsfiddle.net/EnjB3/8/


4

Phù thủy;)

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

Bản trình diễn: http://jsfiddle.net/molokoloco/hgXyq/24/


4

Sử dụng event.keyvà hiện đại JS!

Không còn mã số nữa. Bạn có thể kiểm tra chìa khóa trực tiếp. Ví dụ "Enter", "LeftArrow", "r", hoặc "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...
    }
});

Tài liệu Mozilla

Trình duyệt được hỗ trợ


3
$(document).bind('keypress', function (e) {
    console.log(e.which);  //or alert(e.which);

});

bạn nên có một con bọ rùa để xem kết quả trong giao diện điều khiển


3

Một số trình duyệt sử dụng keyCode, một số khác sử dụng. Nếu bạn đang sử dụng jQuery, bạn có thể sử dụng một cách đáng tin cậy khi jQuery chuẩn hóa mọi thứ. Thực ra,

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

    }
});

2

Theo câu trả lời của Kilian:

Nếu chỉ nhập phím bấm là quan trọng:

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

2

Cách dễ nhất mà tôi làm là:

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

1
Nó sẽ tốt hơn để sử dụng event.whichthay vì event.keyCode. Từ API jQuery :The event.which property normalizes event.keyCode and event.charCode. It is recommended to watch event.which for keyboard key input.
zanetu

2

Tôi vừa tạo một plugin cho jQuery cho phép dễ dàng hơn keypress các sự kiện . Thay vì phải tìm số và đặt nó vào, tất cả những gì bạn phải làm là:

Làm thế nào để sử dụng nó

  1. Bao gồm mã tôi có dưới đây
  2. Chạy mã này:
$(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 
    }
});

Nó đơn giản mà. Xin lưu ý rằng theKeyYouWantToFireAPressEventForkhông một con số, nhưng một chuỗi (ví dụ như "a"cháy khi Ađược nhấn, "ctrl"để lửa khi được nhấn, hoặc, trong trường hợp của một số, chỉ , không có dấu ngoặc kép. Điều đó sẽ bắn khi được nhấn.)CTRL (control)11

Ví dụ / Mã:

Bởi vì phiên bản dài rất ... tốt ... dài, tôi đã tạo một liên kết PasteBin cho nó:
http://pastebin.com/VUaDevz1


Bạn có thể làm cho hàm ngắn hơn và nhanh hơn nhiều nếu bạn không sử dụng hàng triệu phép so sánh "nếu" -> jsfiddle.net/BlaM/bcguctrx - Ngoài ra, hãy lưu ý rằng - ví dụ: openbrquet và closebrquet không mở / đóng ngoặc trên một Bàn phím tiếng Đức.
BlaM

Tôi thích giải pháp này. đẹp.
Jay


-9

Thử cái này:

jQuery('#myInput').keypress(function(e) {
    code = e.keyCode ? e.keyCode : e.which;
    if(code.toString() == 13) {
        alert('You pressed enter!');
    }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.