Запустить событие нажатия клавиш / нажатия клавиш / нажатия клавиш в JS / jQuery?

173

Каков наилучший способ имитации ввода пользователем текста в поле ввода текста в JS и / или jQuery?

На самом деле я не хочу помещать текст в поле ввода, я просто хочу вызвать все обработчики событий , которые обычно запускаются пользователем, вводящим информацию в поле ввода. Это означает фокусировку, нажатие клавиш, нажатие клавиш, нажатие клавиш и размытие. Думаю.

Так как же это сделать?

Alex
источник

Ответы:

240

Вы можете вызвать любое из событий с помощью прямого вызова, например:

$(function() {
    $('item').keydown();
    $('item').keypress();
    $('item').keyup();
    $('item').blur();
});

Это делает то, что вы пытаетесь сделать?

Вы, вероятно, должны также вызвать .focus()и потенциально.change()

Если вы хотите инициировать события клавиш с определенными клавишами, вы можете сделать это следующим образом:

$(function() {
    var e = $.Event('keypress');
    e.which = 65; // Character 'A'
    $('item').trigger(e);
});

Здесь происходит интересное обсуждение событий нажатия клавиш: jQuery Event Keypress: Какая клавиша была нажата? особенно в отношении кросс-браузерной совместимости со свойством .which.

ebynum
источник
3
или$('item').trigger('keypress', {which: 'A'.charCodeAt(0)});
Боб Стейн
@ebynum Можете ли вы написать код с помощью Javascript (без jquery).
Крис П,
1
Если вам нужно Ctrl: ctrlKey: true, также: shiftKey,altKey
Илья Зеленько
52

Вы можете отправлять такие события, как

el.dispatchEvent(new Event('focus'));
el.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));
aljgom
источник
5
илиel.dispatchEvent(new Event('keypress', {keyCode: 'a'}))
Cuzox
1
@Cuzox, почему бы не использовать KeyboardEvent? Это автоматически заполняет значения как shiftKey, и это правильный путь. Кроме того, вы кладете строку в keyCode, что неправильно.
SuperOP535
7
Если вам нужно Ctrl: el.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 70, ctrlKey: true }));(это вызовет ярлык Ctrl + F)
Илья Зеленько
31

Чтобы вызвать enterнажатие клавиши, мне пришлось изменить ответ @ebynum, в частности, используя свойство keyCode.

e = $.Event('keyup');
e.keyCode= 13; // enter
$('input').trigger(e);
cloakedninjas
источник
2
keydownсобытие не было поймано или я что-то здесь не так делаю? fiddle.jshell.net/Palestinian/8d8J9
Омар
@ Cloak: это работает. Проверьте мой комментарий здесь для полного селектора, чтобы исправить элементы управления asp.net: codeproject.com/Tips/269388/… Убедитесь, что вы вызываете его после того, как вставляете что-либо в dom, если используете Ajax.
Дэн Рэндольф
23

Вот пример vanilla js для запуска любого события:

function triggerEvent(el, type){
if ('createEvent' in document) {
        // modern browsers, IE9+
        var e = document.createEvent('HTMLEvents');
        e.initEvent(type, false, true);
        el.dispatchEvent(e);
    } else {
        // IE 8
        var e = document.createEventObject();
        e.eventType = type;
        el.fireEvent('on'+e.eventType, e);
    }
}
Sionnach733
источник
7
Можете ли вы привести несколько примеров использования? Как ваша функция будет использоваться для отправки кода ключа?
Mac
6
Исходный код этого поста можно найти по следующей ссылке, которая включает документацию: plainjs.com/javascript/events/trigger-an-event-11
Kieren Dixon
17

Вы можете достичь этого с помощью: EventTarget.dispatchEvent(event)и, передав новое KeyboardEvent в качестве события.

Например: element.dispatchEvent(new KeyboardEvent('keypress', {'key': 'a'}))

Рабочий пример:

// get the element in question
const input = document.getElementsByTagName("input")[0];

// focus on the input element
input.focus();

// add event listeners to the input element
input.addEventListener('keypress', (event) => {
  console.log("You have pressed key: ", event.key);
});

input.addEventListener('keydown', (event) => {
  console.log(`key: ${event.key} has been pressed down`);
});

input.addEventListener('keyup', (event) => {
  console.log(`key: ${event.key} has been released`);
});

// dispatch keyboard events
input.dispatchEvent(new KeyboardEvent('keypress',  {'key':'h'}));
input.dispatchEvent(new KeyboardEvent('keydown',  {'key':'e'}));
input.dispatchEvent(new KeyboardEvent('keyup', {'key':'y'}));
<input type="text" placeholder="foo" />

MDN рассылка событий

MDN KeyboardEvent

JSON C11
источник
12

Теперь вы можете сделать:

var e = $.Event("keydown", {keyCode: 64});
simonzack
источник
2

Прежде всего, нужно сказать, что образец от Sionnach733 работал безупречно. Некоторые пользователи жалуются на отсутствие реальных примеров. Вот мои два цента. Я работал над симуляцией щелчка мыши при использовании этого сайта: https://www.youtube.com/tv . Вы можете открыть любое видео и попробовать запустить этот код. Он выполняет переход к следующему видео.

function triggerEvent(el, type, keyCode) {
    if ('createEvent' in document) {
            // modern browsers, IE9+
            var e = document.createEvent('HTMLEvents');
            e.keyCode = keyCode;
            e.initEvent(type, false, true);
            el.dispatchEvent(e);
    } else {
        // IE 8
        var e = document.createEventObject();
        e.keyCode = keyCode;
        e.eventType = type;
        el.fireEvent('on'+e.eventType, e);
    }
}

var nextButton = document.getElementsByClassName('icon-player-next')[0];
triggerEvent(nextButton, 'keyup', 13); // simulate mouse/enter key press
yuliskov
источник
1

Я подумал, что хочу обратить ваше внимание на то, что в определенном контексте, где слушатель был определен в плагине jQuery, единственное, что успешно имитировало для меня событие нажатия клавиши, в конечном итоге пойманное этим слушателем, было использование setTimeout (). например

setTimeout(function() { $("#txtName").keypress() } , 1000);

Любое использование $("#txtName").keypress()было проигнорировано , хотя размещено в конце .ready() function. Никакого конкретного дополнения DOM в любом случае не создавалось асинхронно.

Фабьен Хаддади
источник
1

Для приведения типов к KeyboardEventInit и предоставления правильного целого числа keyCode

const event = new KeyboardEvent("keydown", {
          keyCode: 38,
        } as KeyboardEventInit);
Евгений Сунич
источник
1
@CamiRodriguez все, что вы можете делать в TypeScript, вы можете делать в JS (так же, как jQuery). За исключением того, что TypeScript не портит синтаксис JS, просто расширяет их. Если вы удалите `as KeyboardEventInit`, это будет в основном код JS. +1 за ответ, спасибо.
Герго Хорват