jQuery подія клавіші: яку клавішу натискали?


706

Як дізнатися, яка клавіша була натиснута, коли я прив'язуюсь до події натискання клавіші за допомогою jQuery?

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

Я хочу викликати подання при ENTERнатисканні.

[Оновлення]

Навіть незважаючи на те, що я знайшов (або краще: один) відповідь сам, мабуть, є місце для варіації;)

Чи є різниця між keyCodeі which- особливо, якщо я просто шукаю ENTER, який ніколи не буде ключем Unicode?

Чи надають одні браузери одну власність, а інші надають іншу?


295
** Якщо хтось досяг цього з Google (як я), знайте, що "клавіатура" замість "натискання клавіші" працює у Firefox, IE та Chrome. "keypress", мабуть, працює лише у Firefox.
Тайлер

17
також "keydown" працює краще, ніж "keyup" для запуску події ПІСЛЯ натискання клавіші (очевидно), але це важливо, якщо ви скажете, що хочете запустити подію на SECOND backspace, якщо textarea порожня
Tyler

12
Що стосується e.keyCode VS e.which ... З моїх тестів, Chrome та IE8: обробник keypress () буде спрацьовувати лише для звичайних символів (тобто не вгору / вниз / Ctrl), а також e.keyCode та e. який поверне ASCII код. Однак у Firefox всі клавіші спрацьовують натискання клавіші (), АЛЕ для звичайних символів, наприклад, які повернуть код ASCII, а e.keyCode поверне 0, а для спеціальних символів (наприклад, вгору / вниз / Ctrl) e.keyCode повернеться код клавіатури, і наприклад, який поверне 0. Як весело.
jackocnr

4
Попередження: НЕ використовуйте той з коду google. Автор jquery подав патч, який знаходиться лише у сховищі github (а також виделка Джона Ресіга ): github.com/tzuryby/jquery.hotkeys . Той, який знаходиться в коді google, погано поводиться, коли прив'язує більше ніж одну ключову подію до того самого вузла дому. Новий це вирішує.
Даніель Рібейро

4
"клавіатура" спрацює дуже пізно, коли ви, наприклад, довго натискаєте клавішу. Дивіться тут jsbin.com/aquxit/3/edit, тому клавіатура - це шлях
Тоскан

Відповіді:


844

Насправді це краще:

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

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

49
Відповідно до коментаря, поданого нижче на цій сторінці, jQuery нормалізується так, що "що" визначається на об'єкт події кожного разу. Отже, перевірка "keyCode" повинна бути непотрібною.
Ztyx

197
Чому величезний підсумок рахується? Питання стосується jQuery, який нормалізує цей матеріал, тому не потрібно використовувати нічого, окрімe.which будь-якої події, яку ви використовуєте.
Тім Даун

48
@Tim: На жаль, я щойно тестував це з Firefox за допомогою api.jquery.com/keypress : коли я натискаю <Tab>, e.whichне встановлюється (залишається 0), але e.keyCodeє ( 9). Дивіться stackoverflow.com/questions/4793233/…, чому це має значення.
Марсель Корпель

3
@Marcel: Так, керування ключами jQuery має недоліки, і це невдалий приклад, але для клавіші Enter, про яку задається це питання, ситуація надзвичайно проста.
Тім Даун

133

Спробуйте це

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

5
@ВладимирПрудников Ой, ой, а-а! А-а! десь на цьому посиланні були мак-евері - людство !!!
Бен ДеМотт

1
Ну, ми запустили нову версію і з додатком Windows .. перевірити snippets.me
Володимир Прудников

2
@VladimirPrudnikov як щодо версії Linux?
Арда

@Arda у нас немає планів на версію Linux. Буде веб-додаток та загальнодоступний API, тож, може, хтось створить його :)
Володимир Прудников

1
Ха-ха-ха, інструмент для розробників без планів на Linux. Багатий!
Ziggy

61

Якщо ви використовуєте інтерфейс jQuery, у вас є переклади для загальних кодів ключів. В ui / ui / ui.core.js :

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

Також є деякі переклади в тестах / simulate / jquery.simulate.js, але я не зміг знайти жодного в основній бібліотеці JS. Майте на увазі, я просто привітався з джерелами. Можливо, є якийсь інший спосіб позбутися цих магічних чисел.

Ви також можете використовувати String.charCodeAt та .fromCharCode:

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

13
Виправлення це * $. Ui.keyCode.ENTER ** не * $. KeyCode.ENTER - працює як шарм, хоча THX для підказки!
daniellmb

Uncaught TypeError: String.charCodeAt is not a functionЯ думаю, ти мав намір сказати'\r'.charCodeAt(0) == 13
Патрік Робертс

39

Враховуючи, що ви використовуєте jQuery, ви повинні абсолютно використовувати .which. Так, різні браузери встановлюють різні властивості, але jQuery їх нормалізує та встановить .which значення у кожному конкретному випадку. Дивіться документацію на веб-сайті http://api.jquery.com/keydown/, в якій зазначено:

Щоб визначити, яка клавіша була натиснута, ми можемо вивчити об'єкт події, який передається функції обробника. Хоча браузери використовують різні властивості для зберігання цієї інформації, jQuery нормалізує властивість .which, щоб ми могли надійно використовувати її для отримання ключового коду.


2
З того, що я бачив, використовуючи event.which і намагаючись порівняти з $ .ui.keyCode, це призводить до непевної поведінки. Зокрема, малий [L] ключ, який відображає на $ .ui.keyCode.NUMPAD_ENTER. Симпатичний.
Денні

4
Чи є у вас докір, який демонструє цю помилку? Краще повідомити про це власникам jQuery, а не намагатися повторно виконати свою роботу.
Френк Швітерман

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власності.
Слакс

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
Це справжня відповідь. Прийнятий працюватиме для деяких клавіш (наприклад, enter), але для інших не вдасться (на кшталт supr, що помилятиметься.)
Оскар Фолі

19
Це пряма паста з джерела jQuery і це код, який використовує jQuery для нормалізації властивості .which події.
Ian Clelland

@Ian Clelland: я не можу зрозуміти вашу думку, правильно це чи ні !? lol
Лука Філософі

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

Це майже повний список keyCodes:

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"



5

Я просто доповнити код рішення цим рядком e.preventDefault();. У разі введення форми форми ми не відвідуємо, щоб подати натиснутою клавішею Enter

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, яке обробляє натиснуту клавішу введення.

(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
$(document).bind('keypress', function (e) {
    console.log(e.which);  //or alert(e.which);

});

у вас повинна з’явитися виправна помилка, щоб побачити результат у консолі


3

Деякі браузери використовують keyCode, інші використовують який. Якщо ви використовуєте jQuery, ви можете надійно використовувати те, що як jQuery стандартизує речі. Насправді,

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

    }
});

2

Відповідно до відповіді Кіліана:

Якщо важливо лише ввести натискання клавіш:

<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. Від 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

Я тільки що зробив плагін для 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

Мені сподобалось це рішення. приємно.
Джей


-9

Спробуйте це:

jQuery('#myInput').keypress(function(e) {
    code = e.keyCode ? e.keyCode : e.which;
    if(code.toString() == 13) {
        alert('You pressed enter!');
    }
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.