Запустити подію клавіші / клавіші / клавіші в JS / jQuery?


173

Який найкращий спосіб імітувати користувача, що вводить текст у поле введення тексту у JS та / або jQuery?

Я не хочу фактично вводити текст у поле введення, я просто хочу запустити всі обробники подій, які, як правило, спрацьовують користувачем, вводячи інформацію у поле введення. Це означає фокусування, натискання клавіш, натискання клавіш, клавіатуру та розмиття. Я думаю.

То як би це досягти?

Відповіді:


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 подія Keypress: яку клавішу натискали? , зокрема щодо сумісності крос-браузера із властивістю .which.


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'}));

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

2
keydownподія не спіймана, чи я роблю щось не так? fiddle.jshell.net/Palestinian/8d8J9
Омар

@cloak: працює. Ознайомтесь з моїм коментарем тут щодо повного вибору, щоб виправити елементи управління asp.net: codeproject.com/Tips/269388/… Переконайтесь, що ви зателефонували після того, як ви вставите що-небудь у домі , якщо використовуєте Ajax.
Дан Рендольф

23

Ось приклад ванільного 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);
    }
}

7
Чи можете ви надати кілька прикладів використання? Як ваша функція використовувалась для надсилання коду ключа?
Мак

6
Вихідний код для цієї публікації можна знайти за наступним посиланням, яке включає документацію: plainjs.com/javascript/events/trigger-an-event-11
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 відправленняEvent

MDN KeyboardEvent



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

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, а лише розширить їх. Якщо ви видалите `як KeyboardEventInit`, це в основному код JS. +1 за відповідь, дякую.
Gergő Horváth
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.