Остаточний спосіб викликати події клавіші за допомогою jQuery


260

Я прочитав усі відповіді на це питання, і, здається, жодне з рішень не працює.

Крім того, я отримую вибране, що спрацьовування натискання клавіш зі спеціальними символами взагалі не працює. Чи може хтось перевірити, хто це зробив?


14
Ніхто не прогадав поняття концепції. Це не так, як це повинно працювати. тригер буде викликати лише обробник події. Фактично він не надрукує ключ. Якщо ви хочете імітувати ефект друку ключа, то просто додайте ключ до вхідного значення та одночасно запускайте подію.
Надія Алрамлі

Цікаво, я цього не знав. У такому випадку, чи можете ви сказати мені, якщо запуск події також спричинить її для мов, що не мають jquery. Наприклад, якщо у мене встановлений onKeydown в простому JS, чи буде він фіксувати мою "підроблену" подію?
мкоряк

2
так, якщо в простому js було встановлено onkeydown = '...'. Це буде спровоковано фальшивою подією. Я не був у цьому впевнений. Але я зробив швидкий тест і це спрацювало.
Надя Алрамлі

2
@Nadia Дякую за це! Я прочитав усі відповіді, цікавлячись, чому речі не працювали, перш ніж зрозуміти мої сподівання, що вони не були правильними. Я підозрюю, що багато інших людей будуть мати ті ж помилки.
mikemaccana

3
Через два роки ... читаючи сторінку, здається, що остаточним способом є: $ ('input # search'). Тригер ($. Подія ('keydown', {котрий: $. Ui.keyCode.ENTER, keyCode: $ .ui.keyCode.ENTER}));
молоколоко

Відповіді:


365

Якщо ви хочете запустити подію клавіші або клавішу, то все, що вам потрібно зробити:

var e = jQuery.Event("keydown");
e.which = 50; // # Some key code value
$("input").trigger(e);

42
питання в тому, як запустити, а не як захопити
Чад Грант

2
Я додав приклад для запуску події
Надія Алрамлі

4
Дуже приємна відповідь. Варто зазначити, що jQuery.Event доступний для jQuery 1.3 або новішої версії. Це стало актуальним в цьому питанні: stackoverflow.com/questions/1823617 / ...
artlung

8
Це не спрацювало для мене із повзунком інтерфейсу jQuery UI. Я повинен був встановити e.keyCode, як відповідь OreiA нижче.
crizCraig

2
fwiw, я мав більший успіх у «клавіатурі» для своєї заявки
відзначте

81

Трохи лаконічніше з jQuery 1.6+ :

var e = jQuery.Event( 'keydown', { which: $.ui.keyCode.ENTER } );

$('input').trigger(e);

(Якщо ви не використовуєте інтерфейс jQuery, замість цього введіть відповідний код коду.)


4
Просто не забудьте замінити "keyCode" на "котрий".
Річард Нієнабер

Так, ви повинні визначити, який і keyCode захищений (якщо слухач подій перевіряє наявність e.keyCode, він працюватиме лише якщо ви визначите keyCode під час створення об’єкта jQuery.Event)
jackocnr

1
jQuery нормалізує, котрий / keyCode, так що вводиться або один, повинен робити і те, і інше.
Найджел Ангел

+1 за посиланням на api.jquery.com; та поточні версії jQuery не нормалізують, котрий / keyCode, тому вам слід забезпечити обидві для безпеки
Віктор,

2
@SamuelLindblom Я повинен був це зрозуміти: jQuery не нормалізує властивості подій, переданих через .trigger(jQuery.Event('name', props)). Подивіться на приклад jsfiddle.net/9ggmrbpd/1 - властивості викликаної події передаються як є. Вихідний код: github.com/jquery/jquery/blob/master/src/event.js#L739
Віктор

68

Справжня відповідь повинна включати keyCode:

var e = jQuery.Event("keydown");
e.which = 50; // # Some key code value
e.keyCode = 50
$("input").trigger(e);

Навіть незважаючи на те, що на веб-сайті jQuery написано, що які і keyCode нормалізуються, вони дуже сильно помиляються. Завжди найбезпечніше проводити стандартні крос-браузерні перевірки для e.which та e.keyCode, і в цьому випадку просто визначте обидва.


34
+1. До речі, e.keyCode = e.which = 50;в одному рядку було б приємніше. :)
Sk8erPeter

Я щойно з’ясував, що використовувати тільки keyCodeне вийшло. Довелося встановити обидва, щоб він працював
Тасос К.

@ Sk8erPeter це не буде, якщо це не змагання з кодування
гольфа

18

Якщо ви також використовуєте інтерфейс jQuery, ви можете зробити так:

var e = jQuery.Event("keypress");
e.keyCode = $.ui.keyCode.ENTER;
$("input").trigger(e);

1
наприклад, який, здається, не працює зі своїм повзунком інтерфейсу jQuery UI. Дякую за цю відповідь. Це справді працює.
crizCraig

5

Я змусив це працювати з клавіатурою.

$("#id input").trigger('keyup');

3
у своєму питанні 6 років тому я також хотів встановити код коду, але не знав, як.
мкоряк

4

Гаразд, для мене, хто працює з цим ...

var e2key = function(e) {
    if (!e) return '';
    var event2key = {
        '96':'0', '97':'1', '98':'2', '99':'3', '100':'4', '101':'5', '102':'6', '103':'7', '104':'8', '105':'9', // Chiffres clavier num
        '48':'m0', '49':'m1', '50':'m2', '51':'m3', '52':'m4', '53':'m5', '54':'m6', '55':'m7', '56':'m8', '57':'m9', // Chiffres caracteres speciaux
        '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', // Alphabet
        '37':'left', '39':'right', '38':'up', '40':'down', '13':'enter', '27':'esc', '32':'space', '107':'+', '109':'-', '33':'pageUp', '34':'pageDown' // KEYCODES
    };
    return event2key[(e.which || e.keyCode)];
};

var page5Key = function(e, customKey) {
    if (e) e.preventDefault();
    switch(e2key(customKey || e)) {
        case 'left': /*...*/ break;
        case 'right': /*...*/ break;
    }
};

$(document).bind('keyup', page5Key);

$(document).trigger('keyup', [{preventDefault:function(){},keyCode:37}]); 

2

Якщо вам потрібно врахувати поточний вибір курсору та тексту ...

Це не працювало для мене для програми AngularJS у Chrome. Як зазначає Надя в оригінальних коментарях, персонаж ніколи не видно у полі введення (принаймні, це був мій досвід). Крім того, попередні рішення не враховують поточний вибір тексту у полі введення. Мені довелося скористатися чудовою бібліотекою jquery-selection .

У мене є спеціальна на екрані цифрова клавіатура, яка заповнює кілька полів введення. Мені довелося...

  1. На фокусі збережіть елемент lastFocus.element
  2. Під час розмиття збережіть поточний вибір тексту (старт та зупинка)

    var pos = element.selection('getPos')
    lastFocus.pos = { start: pos.start, end: pos.end}
  3. Після натискання кнопки на моїй клавіатурі:

    lastFocus.element.selection( 'setPos', lastFocus.pos)
    lastFocus.element.selection( 'replace', {text: myKeyPadChar, caret: 'end'})



1

Це можна виконати так, як цей документ

$('input').trigger("keydown", {which: 50});

1
Це, мабуть, не працює, оскільки для цього використовується аргумент extraParameters, який не встановлює нічого в аргументі події, але додає додаткові аргументи до зворотного виклику обробника події.
TimeWaster

1
Неправильне рішення
Entwickler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.