Последнее обновление:
Как программно нажать на клавишу в языке javascript?
Нажать руками на клавиатуре клавишу очень просто - об этом все знают. А вот как эмулировать такое нажатие? Т.е. как сделать команду на языке JS (javascript), чтобы компьютер "подумал", что будто бы пользователь сам нажал клавишу? По-другому это называется еще эмуляцией нажатия клавиш. Для примера, рассмотрим клавишу Escape. Как ее "нажать"?
Для решения подобных задач можно использовать пользовательские (кастомные) события клавиатуры. Их, эти события, следует создать и потом - запускать. Они и обеспечат программное нажатие клавиш средствами JS.
Посмотрим такой программный код:
var ev = document.createEvent('KeyboardEvent'); // Имитируем нажатие Escape (а иначе НЕ будет удален обработчик keydown)
if(typeof ev.initKeyEvent !== 'function'){ Для новых браузеров; ( > Firefox 30 )
document.body.dispatchEvent(new KeyboardEvent("keydown", {
key: "Escape",
keyCode: 27, // Это цифровой код клавиши Escape.
code: "Escape", // Код клавиши в буквенном виде.
which: 27,
shiftKey: false, // false, т.к. мы не хотим одновременно нажимать и удерживать клавиши Shift,
ctrlKey: false, // Ctrl,
metaKey: false // meta
}));
}else{ // // Для старых браузеров ( <= Firefox 30)
ev.initKeyEvent(
'keydown', // Тип события: keydown, keyup, keypress
true, // bubbles
true, // cancelable
window, // view: должно быть window
false, // ctrlKey
false, // altKey
false, // shiftKey
false, // metaKey
27, // keyCode: также может быть 0
0 // charCode: unsigned long - Unicode-символ, связанный с клавишей, также м.б. 0
);
document.body.dispatchEvent(ev);
}
Немного пояснений
Вначале задаем переменную ev, представляющую собой событие клавиатуры. Выясняем, есть ли у нее метод initKeyEvent (т.е. является ли он, собственно, методом, т.е. функцией). Если НЕ является, значит, по всей видимости, мы имеем дело уже с новым браузером, в котором данный метод не работает (в силу того, что он является устаревшим, deprecated). В новых браузерах следует создавать события клавиатуры на основе конструктора: new KeyboardEvent.
Далее - все просто. Событие клавиатуры в данном примере создается для элемента document.body, представляющего собой тег <body> вебстраницы, т.е., по сути, всю ее область. Можно, разумеется, назначить такое событие и для другого элемента, если не следует его вызывать для всего тела страницы.
Наконец, далее задается событие через конструктор и сразу же и запускается командой dispatchEvent. В качестве аргумента конструктора фигурирует специальный объект, в котором задаются соответствующие свойства будущего события клавиатуры.
Но что, если браузер - старый? Ведь любой уважающий себя (и окружающих) вебразработчик обязан делать кроссбраузерную вебстраницу - такую, которая бы без проблем открывалась и функционировала не только в новых браузерах, но и в тех, которые постарше.
Напоминаем золотое правило вебразработчиков: делаем веб страницы не для роботов (к которым относятся браузеры тоже), а для людей. И не нам указывать, каким браузером будет пользоваться человек при просмотре нашего сайта.
Такой браузер может не поддерживать конструктор KeyboardEvent, но зато он, скорее всего, поддерживает метод initKeyEvent для пользовательского события клавиатуры. Для него будет работать код после слова else.
Как видим, в этом случае также используется специальный объект со свойствами события и затем точно также используется метод dispatchEvent, только не в виде конструктора.
Сделав такой простой программный код, мы избавляемся от необходимости использовать соответствующий полифилл и добьемся универсальности его работы в самых разных браузерах. Судя по информации с сайта caniuse.com, конструктор работоспособен в браузерах, начиная от Firefox 31, Google Chrome 26, Opera 15 и т.д. Т.е. он работоспособен даже в уже достаточно немолодых браузерах. Ну, а дополнения с initKeyEvent делает его рабочим, наверное, практически везде, даже в несколько подзабытых IE9+. В некоторых браузерах, например, Firefox 32 - 38 (как минимум) работоспособна оба варианта (фактически же сработает первый).
