Можно ли программно моделировать события нажатия клавиш в JavaScript?
javascript
dom-events
загар
источник
источник
Ответы:
Версия без jquery, которая работает как в webkit, так и в gecko:
источник
keyCode
всегда 0, и я не могу его изменить.event.which
всегда будет0
при использованииdocument.createEvent("KeyboardEvent")
. @lluft поделился подробностями и обходным путем, который работал для меня, в этом комментарии в другой ветке. По сути, вам нужно использоватьdocument.createEvent('Event')
для создания общего события, а затем установить типkeydown
и датьkeyCode
свойство, равное charcode ключа.Если вы можете использовать jQuery 1.3.1:
источник
trigger
нельзя использовать для имитации событий собственного браузера .То, что вы можете сделать, это программно запускать слушатели ключевых событий путем запуска ключевых событий . Имеет смысл разрешить это с точки зрения безопасности. Используя эту способность, вы можете применить типичный шаблон наблюдателя . Вы можете назвать этот метод "имитацией".
Ниже приведен пример того, как этого добиться в стандарте W3C DOM вместе с jQuery:
Этот пример адаптирован из: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
В jQuery:
Но в последнее время [DOM] не существует способа вызвать события, оставляющие браузер-песочницу. И все основные поставщики браузеров будут придерживаться этой концепции безопасности.
Что касается плагинов, таких как Adobe Flash, которые основаны на NPAPI и позволяют обходить песочницу: это постепенный отказ ; Firefox .
Детальное объяснение:
Вы не можете и не должны по соображениям безопасности (как уже указывал Пекка). Вы всегда будете требовать взаимодействия пользователя между ними. Кроме того, представьте, что пользователи браузеров могут подать в суд на пользователей, поскольку различные программные события на клавиатуре приведут к подделке атак.
Смотрите этот пост для альтернатив и более подробной информации. Всегда есть флэш на основе копирования и вставки. Вот элегантный пример . В то же время это свидетельство того, почему Интернет отходит от поставщиков плагинов.
В случае политики CORS opt-in применяется аналогичный подход к безопасности для программного доступа к удаленному контенту.
Ответ
таков: в нормальных условиях нет возможности программно запускать клавиши ввода в изолированной среде браузера .
Итог: я не говорю, что это не будет возможно в будущем, при специальных режимах браузера и / или привилегиях для достижения конечной цели игры или подобного пользовательского опыта. Однако до входа в такие режимы у пользователя будут запрашиваться разрешения и риски, аналогичные модели полноэкранного API .
Полезно: в контексте KeyCodes этот инструмент и сопоставление кодов ключей пригодятся.
Раскрытие: ответ основан на ответе здесь .
источник
Вы можете отправлять события клавиатуры на элемент, подобный этому
источник
keypress
это устарело,keydown
вместо этого используйте -> developer.mozilla.org/en-US/docs/Web/Events/keypressВы можете использовать
dispatchEvent()
:Я не проверял это, но он адаптирован из кода документации dispatchEvent () . Вы, вероятно, захотите прочитать это, а также документы для createEvent () и initKeyEvent ().
источник
initKeyEvent
или нетinitKeyboardEvent()
. Оба устарели в пользу использования конструктора KeyboardEvent () .Вы можете создавать и отправлять события клавиатуры, и они будут запускать соответствующие зарегистрированные обработчики событий, однако они не будут генерировать никакого текста , если отправлены, например, в элемент ввода.
Чтобы полностью имитировать ввод текста, необходимо создать последовательность событий клавиатуры и явно указать текст элемента ввода. Последовательность событий зависит от того, насколько тщательно вы хотите смоделировать ввод текста.
Простейшая форма будет:
источник
В некоторых случаях
keypress
событие не может обеспечить требуемую функциональность. Из документации Mozilla мы видим, что эта функция устарела:Таким образом, поскольку
keypress
событие комбинируется из двух последовательно запускаемых событийkeydown
и следующихkeyup
за ним для одного и того же ключа, просто генерируйте события по одному:источник
Основываясь на ответе alex2k8, вот пересмотренная версия, которая работает во всех браузерах, которые поддерживает jQuery (проблема заключалась в отсутствии аргументов в jQuery.event.trigger, что легко забыть при использовании этой внутренней функции).
Вы могли бы даже продвинуть это дальше и позволить ему не только имитировать событие, но и фактически вставлять символ (если это элемент ввода), однако при попытке сделать это есть много кросс-браузерных ошибок. Лучше использовать более сложный плагин, такой как SendKeys .
источник
Начиная с 2019 года это решение работает для меня:
Я использовал это в своей браузерной игре, чтобы поддерживать мобильные устройства с симулированной клавиатурой.
Пояснение: этот код отправляет одно
keydown
событие, в то время как нажатие реальной клавиши вызывает одноkeydown
событие (или несколько из них, если оно удерживается дольше), а затем одноkeyup
событие, когда вы отпускаете эту клавишу. Если вам нужныkeyup
события тоже, также можно моделироватьkeyup
события путем изменения"keydown"
к"keyup"
в фрагменте кода.Это также посылает событие для всей веб - страницы, поэтому
document
. Если вы хотите, чтобы только определенный элемент получил событие, вы можете заменить егоdocument
на нужный элемент.источник
Trusted
?)Для тех, кто заинтересован, вы можете надежно воссоздать события ввода с клавиатуры. Чтобы изменить текст в области ввода (перемещать курсоры или страницу с помощью вводимого символа), необходимо внимательно следовать модели событий DOM: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents
Модель должна делать:
Тогда для каждого персонажа:
Тогда, по выбору, для большинства:
Это на самом деле изменяет текст на странице с помощью javascript (без изменения операторов значений) и соответственно отключает любые прослушиватели / обработчики javascript. Если вы ошибетесь в последовательности, javascript не будет запущен в соответствующем порядке, текст в поле ввода не изменится, выбор не изменится или курсор не переместится на следующий пробел в текстовой области.
К сожалению, код был написан для работодателя под NDA, поэтому я не могу поделиться им, но это определенно возможно, но вы должны воссоздать весь «стек» ввода ключа для каждого элемента в правильном порядке.
источник
Этот подход поддерживает кросс-браузерное изменение значения кода ключа . Источник
источник
просто используйте CustomEvent
4 бывших хотят симулировать Ctrl + Z
источник
Вот библиотека, которая действительно помогает: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js
Я не знаю, откуда это взялось, но это полезно. Он добавляет
.simulate()
методwindow.KeyEvent
, поэтому вы используете его простоKeyEvent.simulate(0, 13)
для имитацииenter
илиKeyEvent.simulate(81, 81)
для'Q'
.Я получил его по адресу https://github.com/ccampbell/mousetrap/tree/master/tests .
источник
Это сработало для меня, и это имитирует keyup для моей textaera. если вы хотите его для всей страницы просто поставить
KeySimulation()
на<body>
подобных<body onmousemove="KeySimulation()">
или , если неonmousemove
тоonmouseover
иonload
тоже работает.источник
initKeyboardEvent
это устарело. ( Источник )Он был однорядным из-за простоты использования в контексте консоли. Но, вероятно, полезно еще.
источник
Вот решение, которое работает в Chrome и Chromium (тестировали только эти платформы). Похоже, что в Chrome есть какая-то ошибка или собственный подход к обработке кодов клавиш, поэтому это свойство нужно добавлять отдельно в KeyboardEvent.
источник
Вот что мне удалось найти:
источник
Собственный JavaScript с поддержкой TypeScript:
Введите keyCode или любое другое свойство, которое вы используете, и приведите его к KeyboardEventInit.
пример
источник
Вот что я попробовал с js / typcript в chrome. Спасибо за этот ответ для вдохновения.
источник
как только пользователь нажмет соответствующую клавишу, вы можете сохранить ссылку на нее и использовать ее в любом другом HTML-элементе:
Вы можете установить keyCode, если вы создаете свое собственное событие, вы можете скопировать существующие параметры из любого реального события клавиатуры (игнорируя цели, так как это задание dispatchEvent) и:
источник
Я знаю, что вопрос требует javascript способ имитации нажатия клавиш. Но для тех, кто ищет способ сделать jQuery:
источник
Важнейшая часть для того, чтобы заставить это работать, - осознать это
charCode
,keyCode
и все ониwhich
являются устаревшими методами . Поэтому, если обработка кода событие нажатия клавиши, использует любое из этих трех, он получит поддельный ответ (например, по умолчанию 0).Пока вы получаете доступ к событию нажатия клавиши не устаревшим методом, таким как
key
, вы должны быть в порядке.Для завершения я добавил базовый код Javascript для запуска события:
источник
Я хотел смоделировать нажатие «Tab» ... Разбираясь с ответом Тревора, мы видим, что специальная клавиша, такая как «Tab», действительно нажимается, но мы не видим фактический результат, который имел бы нажатие «Tab» .. ,
попытался с диспетчеризацией этих событий для 'activeElement', а также для объекта глобального документа; оба кода добавлены ниже;
фрагмент ниже:
источник