How do I detect keypresses in Javascript?

JavascriptHtmlKeyboardOnkeypress

Javascript Problem Overview


After looking around on the internet, I've seen a lot of suggestions (use window.onkeypress, use jQuery, etc.) but for almost every option there's a counterargument. How can I detect a keypress in Javascript?

Javascript Solutions


Solution 1 - Javascript

With plain Javascript, the simplest is:

document.onkeypress = function (e) {
    e = e || window.event;
    // use e.keyCode
};

But with this, you can only bind one handler for the event.

In addition, you could use the following to be able to potentially bind multiple handlers to the same event:

addEvent(document, "keypress", function (e) {
    e = e || window.event;
    // use e.keyCode
});

function addEvent(element, eventName, callback) {
    if (element.addEventListener) {
        element.addEventListener(eventName, callback, false);
    } else if (element.attachEvent) {
        element.attachEvent("on" + eventName, callback);
    } else {
        element["on" + eventName] = callback;
    }
}

In either case, keyCode isn't consistent across browsers, so there's more to check for and figure out. Notice the e = e || window.event - that's a normal problem with Internet Explorer, putting the event in window.event instead of passing it to the callback.

References:

With jQuery:

$(document).on("keypress", function (e) {
    // use e.which
});

Reference:

Other than jQuery being a "large" library, jQuery really helps with inconsistencies between browsers, especially with window events...and that can't be denied. Hopefully it's obvious that the jQuery code I provided for your example is much more elegant and shorter, yet accomplishes what you want in a consistent way. You should be able to trust that e (the event) and e.which (the key code, for knowing which key was pressed) are accurate. In plain Javascript, it's a little harder to know unless you do everything that the jQuery library internally does.

Note there is a keydown event, that is different than keypress. You can learn more about them here: https://stackoverflow.com/questions/3396754/onkeypress-vs-onkeyup-and-onkeydown

As for suggesting what to use, I would definitely suggest using jQuery if you're up for learning the framework. At the same time, I would say that you should learn Javascript's syntax, methods, features, and how to interact with the DOM. Once you understand how it works and what's happening, you should be more comfortable working with jQuery. To me, jQuery makes things more consistent and is more concise. In the end, it's Javascript, and wraps the language.

Another example of jQuery being very useful is with AJAX. Browsers are inconsistent with how AJAX requests are handled, so jQuery abstracts that so you don't have to worry.

Here's something that might help decide:

Solution 2 - Javascript

KEYPRESS (enter key)
Click inside the snippet and press Enter key.

Vanilla

document.addEventListener("keypress", function(event) {
  if (event.keyCode == 13) {
    alert('hi.');
  }
});

Vanilla shorthand (ES6)

this.addEventListener('keypress', event => {
  if (event.keyCode == 13) {
    alert('hi.')
  }
})

jQuery

$(this).on('keypress', function(event) {
  if (event.keyCode == 13) {
    alert('hi.')
  }
})

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

jQuery classic

$(this).keypress(function(event) {
  if (event.keyCode == 13) {
    alert('hi.')
  }
})

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

jQuery shorthand (ES6)

$(this).keypress((e) => {
  if (e.keyCode == 13)
    alert('hi.')
})

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Even shorter (ES6)

$(this).keypress(e=>
  e.which==13?
  alert`hi.`:null
)

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Due some requests, here an explanation:

I rewrote this answer as things have become deprecated over time so I updated it and because of some guy in the comments saying it was too much "bla-bla". And it is not about "keydown", it's about "keypress". So some non-character keys like "Esc" aren't supposed to work like that.

I used this to focus on the window scope inside the results when document is ready and for the sake of brevity but it's not necessary.

Deprecated:
The .which and .keyCode methods are actually considered deprecated so I would recommend .code but I personally still use keyCode as the performance is much faster and only that counts for me. The jQuery classic version .keypress() is not officially deprecated as some people say but they are no more preferred like .on('keypress') as it has a lot more functionality(live state, multiple handlers, etc.). The 'keypress' event in the Vanilla version is also deprecated. People should prefer beforeinput or keydown, keyup today.

Performance:
The faster the better. This is why I prefer .keyCode even if it's considered deprecated(in most cases). It's all up to you though (Commited 2020).

Performance Test

Solution 3 - Javascript

Use event.key and modern JS!

No number codes anymore. You can use "Enter", "ArrowLeft", "r", or any key name directly, making your code far more readable.

> NOTE: The old alternatives (.keyCode and .which) are Deprecated.

document.addEventListener("keypress", function onEvent(event) {
    if (event.key === "ArrowLeft") {
        // Move Left
    }
    else if (event.key === "Enter") {
        // Open Menu...
    }
});

Mozilla Docs

Supported Browsers

Solution 4 - Javascript

There are a few ways to handle that; Vanilla JavaScript can do it quite nicely:

function code(e) {
	e = e || window.event;
	return(e.keyCode || e.which);
}
window.onload = function(){
	document.onkeypress = function(e){
		var key = code(e);
		// do something with key
	};
};

Or a more structured way of handling it:

(function(d){
	var modern = (d.addEventListener), event = function(obj, evt, fn){
		if(modern) {
			obj.addEventListener(evt, fn, false);
		} else {
			obj.attachEvent("on" + evt, fn);
		}
	}, code = function(e){
		e = e || window.event;
		return(e.keyCode || e.which);
	}, init = function(){
		event(d, "keypress", function(e){
			var key = code(e);
			// do stuff with key here
		});
	};
	if(modern) {
		d.addEventListener("DOMContentLoaded", init, false);
	} else {
		d.attachEvent("onreadystatechange", function(){
			if(d.readyState === "complete") {
				init();
			}
		});
	}
})(document);

Solution 5 - Javascript

Don't over complicate.

  document.addEventListener('keydown', logKey);
	function logKey(e) {
	  if (`${e.code}` == "ArrowRight") {
        //code here
	  }
    	  if (`${e.code}` == "ArrowLeft") {
        //code here
	  }
    	  if (`${e.code}` == "ArrowDown") {
        //code here
	  }
    	  if (`${e.code}` == "ArrowUp") {
        //code here
	  }
	}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbobismijnnaamView Question on Stackoverflow
Solution 1 - JavascriptIanView Answer on Stackoverflow
Solution 2 - JavascriptThieliciousView Answer on Stackoverflow
Solution 3 - JavascriptGiboltView Answer on Stackoverflow
Solution 4 - JavascriptfainoView Answer on Stackoverflow
Solution 5 - Javascriptuser8967105View Answer on Stackoverflow