Javascript — имитация ключевых событий в Chrome 53

Я пытаюсь имитировать ключевое событие (нажатие) на Chrome 53. Все решения, которые я нашел на StackOverflow, похоже, не работают.

Моя цель состоит в том, чтобы иметь функцию, которая получает keyCode и имитирует нажатие клавиши с ее помощью. Требуется чистый JS

function keyPressSimulate(keyCode) {...?}

Примеры кода, которые я уже пробовал:

Node.prototype.fire=function(type,options){
     var event=new CustomEvent(type);
     for(var p in options){
         event[p]=options[p];
     }
     this.dispatchEvent(event);
}

 document.fire("keyup",{ctrlKey:true,keyCode:90,bubbles:true})

Еще один:

presskey:  function(k) {
                var e = new Event("keydown");
                e.keyCode= k;
                e.which=e.keyCode;
                e.altKey=false;
                e.ctrlKey=true;
                e.shiftKey=false;
                e.metaKey=false;
                document.dispatchEvent(e);
            }

А также:

var e = new KeyboardEvent("keydown", {bubbles : true, cancelable : true, key : "Q", shiftKey : true});
global.document.dispatchEvent(e);

А также:

presskey:  function(k) {
            var keyboardEvent = document.createEvent("KeyboardEvent");

            var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? "initKeyboardEvent" : "initKeyEvent";


            keyboardEvent[initMethod](
                               "keydown",
                                true,      // bubbles oOooOOo0
                                true,      // cancelable
                                window,    // view
                                false,     // ctrlKeyArg
                                false,     // altKeyArg
                                false,     // shiftKeyArg
                                false,     // metaKeyArg
                                k,
                                0          // charCode
            );

            global.document.activeElement.dispatchEvent(keyboardEvent);
         }

person Oz Bar-Shalom    schedule 15.10.2016    source источник
comment
Здесь я нашел много возможных решений: stackoverflow.com/questions/10455626/ И ни один из них не работал у меня   -  person Oz Bar-Shalom    schedule 16.10.2016
comment
Решение должно быть на чистом js   -  person Oz Bar-Shalom    schedule 16.10.2016
comment
Я не хочу показаться грубым, но я не уверен, что кто-то поможет, пока вы не приложите больше усилий с вашей стороны...   -  person evolutionxbox    schedule 16.10.2016
comment
добавление примеров кода, которые я уже пробовал   -  person Oz Bar-Shalom    schedule 16.10.2016


Ответы (1)


Свойство keyCode устарело и не может быть установлено при использовании выделенного KeyboardEvent

Однако вы можете использовать настраиваемое событие и установить любое свойство, которое вы хотите, в качестве двухэтапной операции (оно будет проигнорировано, если оно используется в конструкторе):

<div id="test" onkeydown="this.textContent = event.keyCode;"></div>
<button onclick="
    var e = new Event('keydown'); 
    e.keyCode = 42; 
    document.getElementById('test').dispatchEvent(e);
    ">click me</button>

Редактировать в соответствии с комментариями Событие инициируется взаимодействием пользователя с определенным элементом в документе.

Например, нажатие пользователем клавиши на клавиатуре представляет собой последовательность событий (нажатие клавиши, нажатие клавиши, нажатие клавиши). Некоторые из них захватываются браузером для заполнения значения поля ввода, а затем передаются в Javascript как события. Нет реального способа эмулировать пользователя, нажимающего клавишу из песочницы Javascript, кроме как сделать это вручную (1) определить, где находится фокус, (2) обновить свойства сфокусированного элемента на основе поведения браузера по умолчанию и затем (3) инициировать соответствующие события на целевом элементе.

person Simon    schedule 15.10.2016
comment
Похоже, я уже пробовал это в своих примерах кода. Может быть, я делаю что-то не так. Не могли бы вы привести пример кода? - person Oz Bar-Shalom; 16.10.2016
comment
Я отредактировал свой ответ рабочим примером в Chrome 53.0. - person Simon; 16.10.2016
comment
Не работал для меня. например попробовал даже на странице поиска Google: var e = new Event('keydown'); e.keyCode = 42; document.getElementById('lst-ib').dispatchEvent(e); И ничего... - person Oz Bar-Shalom; 16.10.2016
comment
Что вы ожидали от него? Поле ввода не будет отображать символ в зависимости от события. При выполнении упомянутой вами операции обработчик событий запускается (строка 11697 красивого javascript), как и ожидалось. - person Simon; 16.10.2016
comment
Вся моя проблема заключается в том, чтобы вызвать событие - для этого результата. Мне нужно вызвать нажатие клавиши при вводе (если символ добавить его, если удалить пробел... и т.д.) - person Oz Bar-Shalom; 16.10.2016
comment
Затем вы должны изменить свойство value ввода, а затем вызвать событие. Например, для Google: var i = document.getElementById('lst-ib'); i.value = 'mysearch'; var e = new Event('keydown'); e.keyCode = 13; i.dispatchEvent(e);, но вы должны заранее обновить ввод value. - person Simon; 16.10.2016
comment
Итак, ваше решение - просто изменить значение вручную с помощью кода ключа? Мне нужно определить, является ли это символом или удалением, возвратом или sace, и изменить значение с его помощью? Звучит неправильно - person Oz Bar-Shalom; 16.10.2016
comment
Да, События — это реакция на ввод. Если вы хотите имитировать ввод, вы должны делать все это вручную. Поэтому я предлагаю вам перефразировать свой вопрос или открыть новый для этой конкретной потребности. - person Simon; 16.10.2016
comment
Я думаю, что вопрос очень ясен. У меня есть keyCode, и я хочу имитировать нажатие на клавиатуре с этим keyCode, результат будет таким же, как если бы я нажимал ту же клавишу на моей клавиатуре. - person Oz Bar-Shalom; 16.10.2016
comment
Для изменения выделенного текста предлагается выполнить этот document.execCommand('insertText', true, 'yourtext');, когда происходит щелчок, он также позволяет отменять и повторять действия (по крайней мере, в webkit). - person Timo Huovinen; 20.04.2017