Запустить событие нажатия клавиш / нажатия клавиш / нажатия клавиш в JS / jQuery? - PullRequest
161 голосов
/ 30 июля 2010

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

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

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

Ответы [ 8 ]

223 голосов
/ 30 июля 2010

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

$(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: какая клавиша была нажата? , особенно в отношении совместимости между браузерами со свойством .which.

29 голосов
/ 08 апреля 2017

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

el.dispatchEvent(new Event('focus'));
el.dispatchEvent(new KeyboardEvent('keypress',{'key':'a'}));
28 голосов
/ 04 июня 2013

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

e = $.Event('keyup');
e.keyCode= 13; // enter
$('input').trigger(e);
19 голосов
/ 31 мая 2016

Вот пример ванильного 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);
    }
}
11 голосов
/ 30 января 2015

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

var e = $.Event("keydown", {keyCode: 64});
7 голосов
/ 13 февраля 2018

Этого можно добиться с помощью: 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" />

Отправка MDNEvent

MDN KeyboardEvent

2 голосов
/ 27 августа 2017

Прежде всего, нужно сказать, что сэмпл из 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
0 голосов
/ 06 июня 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...