Command + Enter to Submit Forms

By  on  

I've used Mac's for about six years now but it wasn't until I started using Tweetdeck that I realized how awesome the [COMMAND]+[ENTER] key combination was.  Inside a textarea?  No problem -- [COMMAND]+[ENTER] and the form is submitted.  What if all forms could be that way?  They can be with a little JavaScript!

The JavaScript

There are two routes to go:  adding an event listener to the form (event delegate), or applying an event listener to specific textarea elements.  The safer route is event delegation, as dynamic forms can have many textareas added at any time, but per-textarea assignments are much more efficient. Ultimately it's up to the developer to know their form.  Here are three code samples to accomplish form submission in a variety of ways:

// Assign to individual textarea (most efficient)
myTextarea.addEventListener('keydown', function(e) {
	if(e.keyCode == 13 && e.metaKey) {
		this.form.submit();
	}
});

// Form event delegation - individual form (somewhat efficient)
form.addEventListener('keydown', function(e) {
	if(!(e.keyCode == 13 && e.metaKey)) return;

	var target = e.target;
	if(target.form) {
		target.form.submit();
	}
});

// Body event delegation - any form (least efficient)
document.body.addEventListener('keydown', function(e) {
	if(!(e.keyCode == 13 && e.metaKey)) return;

	var target = e.target;
	if(target.form) {
		target.form.submit();
	}
});


Tweetdeck uses [COMMAND]+[ENTER] as does GitHub on some of their forms.  I've naturally started checking for this key command combo instead of tabbing to a field which will submit the form via traditional [ENTER] key.

Recent Features

  • By
    Responsive Images: The Ultimate Guide

    Chances are that any Web designers using our Ghostlab browser testing app, which allows seamless testing across all devices simultaneously, will have worked with responsive design in some shape or form. And as today's websites and devices become ever more varied, a plethora of responsive images...

  • By
    Being a Dev Dad

    I get asked loads of questions every day but I'm always surprised that they're rarely questions about code or even tech -- many of the questions I get are more about non-dev stuff like what my office is like, what software I use, and oftentimes...

Incredible Demos

  • By
    Truly Responsive Images with responsive-images.js

    Responsive web design is something you hear a lot about these days. The moment I really started to get into responsive design was a few months ago when I started to realise that 'responsive' is not just about scaling your websites to the size of your...

  • By
    Build a Slick and Simple MooTools Accordion

    Last week I covered a smooth, subtle MooTools effect called Kwicks. Another great MooTools creation is the Accordion, which acts like...wait for it...an accordion! Now I've never been a huge Weird Al fan so this is as close to playing an accordion as...

Discussion

  1. Markus

    In case you use jquery event handlers you should wrap the form-element with jquery and call jquery’s .submit() method, otherwise jquery event handlers won’t be fired.

  2. Hey David, great post. I think key actions are one of the awesome UX features we lost from the purely desktop development days. Where I work, we use a ticket tracking service called JIRA. JIRA has some bad ass key actions that make working with the service such a joy. I created a small utility called keyper, https://github.com/dustinhayes/keyper, that allows the user to bind functions to key commands. Hopefully this could help bridge the gap a bit.

  3. Ling

    In some CMS that’s the Shortcut for a linebreak..

    • The standard for linebreak is SHIFT+ENTER, so I would argue the CMS did something unintuitive

  4. Asmor

    Ctrl+enter is the same in Windows. It’s not used everywhere, but it’s pretty common.

  5. I disagree about attaching an event handler to all textareas being the most efficient. If you have a large number of text editors, the form event delegation would be more efficient due to it only using a single event listener.

    • I said that because if your form has numerous INPUT[type=text] elements, you’d be executing functionality upon every keystroke if you were doing event delegation.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!