Skip to content

Instantly share code, notes, and snippets.

@GlauberF
Created April 29, 2020 10:28
Show Gist options
  • Save GlauberF/d8278ce3aa592389e6e3d4e758e6a0c2 to your computer and use it in GitHub Desktop.
Save GlauberF/d8278ce3aa592389e6e3d4e758e6a0c2 to your computer and use it in GitHub Desktop.
A function for simulating key event in JavaScript. You just have to choose what key and keyboard event you want to simulate.
/**
* Simulate a key event.
* @param {Number} keyCode The keyCode of the key to simulate
* @param {String} type (optional) The type of event : down, up or press. The default is down
* @param {Object} modifiers (optional) An object which contains modifiers keys { ctrlKey: true, altKey: false, ...}
*/
function simulateKey (keyCode, type, modifiers) {
var evtName = (typeof(type) === "string") ? "key" + type : "keydown";
var modifier = (typeof(modifiers) === "object") ? modifier : {};
var event = document.createEvent("HTMLEvents");
event.initEvent(evtName, true, false);
event.keyCode = keyCode;
for (var i in modifiers) {
event[i] = modifiers[i];
}
document.dispatchEvent(event);
}
// Setup some tests
var onKeyEvent = function (event) {
var state = "pressed";
if (event.type !== "keypress") {
state = event.type.replace("key", "");
}
console.log("Key with keyCode " + event.keyCode + " is " + state);
};
document.addEventListener("keypress", onKeyEvent, false);
document.addEventListener("keydown", onKeyEvent, false);
document.addEventListener("keyup", onKeyEvent, false);
// Using the function
simulateKey(38);
simulateKey(38, "up");
simulateKey(45, "press");
@uaoleg
Copy link

uaoleg commented Jun 3, 2021

That was super helpful! Thank you!

@b31ngd3v
Copy link

Thanks @GlauberF

@artursobon
Copy link

Pretty nice! Thx!

@DemonLordDiablo
Copy link

can i use this to make alt key forever down, and if so how?

@vpmammana
Copy link

Will it work on Safari?

@SentimentalK
Copy link

how can I send the simulated keys into an input element?

@tkzic
Copy link

tkzic commented Nov 3, 2022

Thank you. This is amazing. Works in Chrome and CEF (Max/MSP jweb)

@m1abdullahh
Copy link

This doesn't work for me, on Chrome 109. What could be the reason? Any help with diagnosing the issue would be appreciated. Thanks!

@ranfomshi
Copy link

Also not working for me on Chrome Version 109.0.5414.120

@GlauberF
Copy link
Author

some improvements and applied the function to typescript.

simulateKey(keyCode: number, type: string, modifiers: {[key: string]: any} = {'isTrusted': true}): void {
        const evtName = (typeof type === 'string') ? 'key' + type : 'keydown';
        const modifiersObj = (modifiers instanceof Object) ? modifiers : {};

        const event = new KeyboardEvent(evtName, { keyCode });

        Object.assign(event, modifiersObj);

        document.dispatchEvent(event);
    }

what to call

simulateKey(38);
simulateKey(38, "up");
simulateKey(45, "press");

Tested on Chrome ( Version 110.0.5481.77 (Official Version) 64-bit)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment