Prevent form submission on Enter key press
Asked Answered
I

20

381

I have a form with two text boxes, one select drop down and one radio button. When the enter key is pressed, I want to call my JavaScript function, but when I press it, the form is submitted.

How do I prevent the form from being submitted when the enter key is pressed?

Illuminati answered 25/5, 2009 at 3:31 Comment(0)
D
469
if(characterCode == 13) {
    // returning false will prevent the event from bubbling up.
    return false; 
} else{
    return true;
}

Ok, so imagine you have the following textbox in a form:

<input id="scriptBox" type="text" onkeypress="return runScript(event)" />

In order to run some "user defined" script from this text box when the enter key is pressed, and not have it submit the form, here is some sample code. Please note that this function doesn't do any error checking and most likely will only work in IE. To do this right you need a more robust solution, but you will get the general idea.

function runScript(e) {
    //See notes about 'which' and 'key'
    if (e.keyCode == 13) {
        var tb = document.getElementById("scriptBox");
        eval(tb.value);
        return false;
    }
}

returning the value of the function will alert the event handler not to bubble the event any further, and will prevent the keypress event from being handled further.

NOTE:

It's been pointed out that keyCode is now deprecated. The next best alternative which has also been deprecated.

Unfortunately the favored standard key, which is widely supported by modern browsers, has some dodgy behavior in IE and Edge. Anything older than IE11 would still need a polyfill.

Furthermore, while the deprecated warning is quite ominous about keyCode and which, removing those would represent a massive breaking change to untold numbers of legacy websites. For that reason, it is unlikely they are going anywhere anytime soon.

Disorderly answered 25/5, 2009 at 3:35 Comment(6)
Is this a situation where PreventDefualt can be used?Solemnity
Yes, instead of the return false.Bushcraft
Instead of eval, you could build an array of the valid functions, then use .indexOf() to check whether the user's input is in that array, and call the function if it is. Reduces scope for errors/users screwing up.Hover
keyCode is now deprecatedHeadrest
While I agree with your note about keyCode and which being deprecated, I think developers should help make that transition by not supporting such legacy browsers, especially now that IE is officially dead and Edge has adopted Chromium. Anyway, a nice tool to inspect the different identifiers keys have is keyjs.devTennison
@Josh, @JohnSlegers, @Tennison KeyboardEvent.code is now supported in major browser versions. So this response can be refactored to use: if (e.code === "Enter")Brewis
P
142

Use both event.which and event.keyCode:

function (event) {
    if (event.which == 13 || event.keyCode == 13) {
        //code to execute here
        return false;
    }
    return true;
};
Pianola answered 20/1, 2012 at 8:17 Comment(7)
Why both event.which and event.keyCode?Palpitation
Some browsers support which others support keyCode. It is good practice to include both.Sevik
Also use the keydown event instead of keyup or keypressStanwinn
@Pianola but what event should this be attached to ?Rachal
@manish, keypress gives you more information to play with than keydown/up. https://mcmap.net/q/88185/-issue-with-javascript-onkeydown-event-which-give-characters-in-upper-case-onlyMelvinmelvina
IE does not support just event.keyCode, tested on a new windows tablet and return key wasn't firing my functions. Adding which as stated above should fix any IE bugs.Dylan
set var charCode = parseInt((e.which) ? e.which : e.keyCode); and then compare if(charCode == 13) { // execute } return false;Alb
U
126

event.key === "Enter"

More recent and much cleaner: use event.key. No more arbitrary number codes!

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

const node = document.getElementsByClassName("mySelect")[0];
node.addEventListener("keydown", function(event) {
    if (event.key === "Enter") {
        event.preventDefault();
        // Do more work
    }
});

Modern style, with lambda and destructuring

node.addEventListener("keydown", ({key}) => {
    if (key === "Enter") // Handle press
})

Mozilla Docs

Supported Browsers

Unleavened answered 14/9, 2017 at 4:25 Comment(7)
isn't this just a macro or alias? is there any benefit in terms of performance by using this code?Robison
keyCode is deprecated. This is more readable and maintainable than a magic integer in your codeUnleavened
For those wondering how to find the key value for different keys, you can use keyjs.devTennison
In 2021, I believe this is the correct answer.Fennie
Readable, yes! Cleaner? 13 is more clean than Enter. There was no questions like, is it "Enter" or "enter". If you can remember "Enter", you can always remember 13. It takes less room.Hite
"abitrary"?! It has existed as a standard since the development of ASCII, ~1961! Itself having been based-upon / derived-from work that began with teletype machines starting 40 years before that! Though it may have begun as such, here, now, in 2022, 60+ years on from the development of that standard, and the ubiquitous implementations that stem therefrom, knowing that 0x0d / (dec)13 represents a carriage-return is well-beyond being just some 'arbitrary' value, and anyone who's been coding for longer than a year should know it as naturally/intrinsically as they know how to breathe air...🙄Kriemhild
Yes, the history is real. However the numbers are arbitrary, just like the arrangement of keys on a keyboard. Few devs have the list of char/key mappings memorizedUnleavened
H
82

If you're using jQuery:

$('input[type=text]').on('keydown', function(e) {
    if (e.which == 13) {
        e.preventDefault();
    }
});
Huddle answered 8/6, 2012 at 17:46 Comment(1)
keyup is fired AFTER the submission, and can't therefore cancel it.Dislocation
H
28

Detect Enter key pressed on whole document:

$(document).keypress(function (e) {
    if (e.which == 13) {
        alert('enter key is pressed');
    }
});

http://jsfiddle.net/umerqureshi/dcjsa08n/3/

Henryson answered 16/6, 2015 at 5:58 Comment(0)
C
18

Override the onsubmit action of the form to be a call to your function and add return false after it, ie:

<form onsubmit="javascript:myfunc();return false;" >
Christophany answered 25/5, 2009 at 3:40 Comment(4)
I cant override onsubmit as i have another form submit in this pageIlluminati
yes you can. Javascript is prototype based language. document.forms["form_name"].onsubmit = fucntion() {}Oswell
I have another delete procedure to run when the form is submitted.So i want to maintain as it isIlluminati
@Illuminati if you want to run both: the action defined in the form tag and also the javascript triggered when pressing the submit button, you can just remove the code return false;, then both action will be triggered.Baptlsta
S
17

A react js solution

 handleChange: function(e) {
    if (e.key == 'Enter') {
      console.log('test');
    }


 <div>
    <Input type="text"
       ref = "input"
       placeholder="hiya"
       onKeyPress={this.handleChange}
    />
 </div>
Southwestwards answered 8/1, 2016 at 7:15 Comment(0)
A
10

So maybe the best solution to cover as many browsers as possible and be future proof would be

if (event.which === 13 || event.keyCode === 13 || event.key === "Enter")
Ariminum answered 22/1, 2019 at 11:21 Comment(0)
I
6

Here is how you can do it using JavaScript:

//in your **popup.js** file just use this function 

    var input = document.getElementById("textSearch");
    input.addEventListener("keyup", function(event) {
        event.preventDefault();
        if (event.keyCode === 13) {
            alert("yes it works,I'm happy ");
        }
    });
<!--Let's say this is your html file-->
 <!DOCTYPE html>
    <html>
      <body style="width: 500px">
        <input placeholder="Enter the text and press enter" type="text" id="textSearch"/> 
          <script type="text/javascript" src="public/js/popup.js"></script>
      </body>
    </html>
Ingunna answered 16/6, 2018 at 23:4 Comment(0)
C
5

Below code will add listener for ENTER key on entire page.

This can be very useful in screens with single Action button eg Login, Register, Submit etc.

<head>
        <!--Import jQuery IMPORTANT -->
        <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>

         <!--Listen to Enter key event-->
        <script type="text/javascript">

            $(document).keypress(function (e) {
                if (e.which == 13 || event.keyCode == 13) {
                    alert('enter key is pressed');
                }
            });
        </script>
    </head>

Tested on all browsers.

Coupon answered 14/12, 2016 at 7:40 Comment(0)
T
4

A little simple

Don't send the form on keypress "Enter":

<form id="form_cdb" onsubmit="return false">

Execute the function on keypress "Enter":

<input type="text" autocomplete="off" onkeypress="if(event.key === 'Enter') my_event()">
Tailpipe answered 1/2, 2019 at 9:30 Comment(0)
M
3

A jQuery solution.

I came here looking for a way to delay the form submission until after the blur event on the text input had been fired.

$(selector).keyup(function(e){
  /*
   * Delay the enter key form submit till after the hidden
   * input is updated.
   */

  // No need to do anything if it's not the enter key
  // Also only e.which is needed as this is the jQuery event object.
  if (e.which !== 13) {
       return;
  }

  // Prevent form submit
  e.preventDefault();

  // Trigger the blur event.
  this.blur();

  // Submit the form.
  $(e.target).closest('form').submit();
});

Would be nice to get a more general version that fired all the delayed events rather than just the form submit.

Milurd answered 8/1, 2014 at 15:49 Comment(0)
Y
3

A much simpler and effective way from my perspective should be :

function onPress_ENTER()
{
        var keyPressed = event.keyCode || event.which;

        //if ENTER is pressed
        if(keyPressed==13)
        {
            alert('enter pressed');
            keyPressed=null;
        }
        else
        {
            return false;
        }
}
Yanyanaton answered 7/6, 2015 at 11:7 Comment(0)
E
2

Using TypeScript, and avoid multiples calls on the function

let el1= <HTMLInputElement>document.getElementById('searchUser');
el1.onkeypress = SearchListEnter;

function SearchListEnter(event: KeyboardEvent) {
    if (event.which !== 13) {
        return;
    }
    // more stuff
}
Eldridge answered 14/3, 2018 at 21:18 Comment(1)
This question is more than eight years old. Typescript did not exist then. So are you sure you're not answering an other question?Incandesce
A
1

native js (fetch api)

document.onload = (() => {
    alert('ok');
    let keyListener = document.querySelector('#searchUser');
    // 
    keyListener.addEventListener('keypress', (e) => {
        if(e.keyCode === 13){
            let username = e.target.value;
            console.log(`username = ${username}`);
            fetch(`https://api.github.com/users/${username}`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((user)=>{
                console.log(`user = ${user}`);
            });
            fetch(`https://api.github.com/users/${username}/repos`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((repos)=>{
                console.log(`repos = ${repos}`);
                for (let i = 0; i < repos.length; i++) {
                     console.log(`repos ${i}  = ${repos[i]}`);
                }
            });
        }else{
            console.log(`e.keyCode = ${e.keyCode}`);
        }
    });
})();
<input _ngcontent-inf-0="" class="form-control" id="searchUser" placeholder="Github username..." type="text">
Aloisius answered 10/6, 2017 at 12:16 Comment(1)
Why has client_id etc been included here? Is the code legit?Glutton
T
1
<div class="nav-search" id="nav-search">
        <form class="form-search">
            <span class="input-icon">
                <input type="text" placeholder="Search ..." class="nav-search-input" id="search_value" autocomplete="off" />
                <i class="ace-icon fa fa-search nav-search-icon"></i>
            </span>
            <input type="button" id="search" value="Search" class="btn btn-xs" style="border-radius: 5px;">
        </form>

</div>

<script type="text/javascript">
    $("#search_value").on('keydown', function(e) {
        if (e.which == 13) {
             $("#search").trigger('click');
            return false;
        }
    });
    $("#search").on('click',function(){
        alert('You press enter');
    });
</script>
Torytoryism answered 28/8, 2017 at 4:41 Comment(0)
J
1
<form id="form1" runat="server" onkeypress="return event.keyCode != 13;">

Add this Code In Your HTML Page...it will disable ...Enter Button..

Jumada answered 8/11, 2019 at 6:16 Comment(0)
T
0

Cross Browser Solution

Some older browsers implemented keydown events in a non-standard way.

KeyBoardEvent.key is the way it is supposed to be implemented in modern browsers.

which and keyCode are deprecated nowadays, but it doesn't hurt to check for these events nonetheless so that the code works for users that still use older browsers like IE.

The isKeyPressed function checks if the pressed key was enter and event.preventDefault() hinders the form from submitting.

  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }

Minimal working example

JS

function isKeyPressed(event, expectedKey, expectedCode) {
  const code = event.which || event.keyCode;

  if (expectedKey === event.key || code === expectedCode) {
    return true;
  }
  return false;
}

document.getElementById('myInput').addEventListener('keydown', function(event) {
  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }
});

HTML

<form>
  <input id="myInput">
</form>

https://jsfiddle.net/tobiobeck/z13dh5r2/

Tjader answered 7/3, 2019 at 17:43 Comment(0)
S
0

Use event.preventDefault() inside user defined function

<form onsubmit="userFunction(event)"> ...

function userFunction(ev) 
{
    if(!event.target.send.checked) 
    {
        console.log('form NOT submit on "Enter" key')

        ev.preventDefault();
    }
}
Open chrome console> network tab to see
<form onsubmit="userFunction(event)" action="/test.txt">
  <input placeholder="type and press Enter" /><br>
  <input type="checkbox" name="send" /> submit on enter
</form>
Slipknot answered 27/7, 2020 at 18:43 Comment(0)
T
-1

I used document on, which covers dynamically added html after page load:

  $(document).on('keydown', '.selector', function (event) {
    if (event.which == 13 || event.keyCode == 13) {
      //do your thang
    }
  });

Added updates from @Bradley4

Targe answered 1/1, 2022 at 4:55 Comment(1)
Only works if you install jquery.Pylon

© 2022 - 2024 — McMap. All rights reserved.