How to submit a form using Enter key in react.js?

ReactjsReactjs Flux

Reactjs Problem Overview


Here is my form and the onClick method. I would like to execute this method when the Enter button of keyboard is pressed. How ?

N.B: No jquery is appreciated.

comment: function (e) {
  e.preventDefault();
  this.props.comment({
    comment: this.refs.text.getDOMNode().value,
    userPostId:this.refs.userPostId.getDOMNode().value,
  })
},


<form className="commentForm">
  <textarea rows="2" cols="110" placeholder="****Comment Here****" ref="text"  /><br />
  <input type="text" placeholder="userPostId" ref="userPostId" /> <br />
  <button type="button" className="btn btn-success" onClick={this.comment}>Comment</button>
</form>

Reactjs Solutions


Solution 1 - Reactjs

Change <button type="button" to <button type="submit". Remove the onClick. Instead do <form className="commentForm" onSubmit={this.onFormSubmit}>. This should catch clicking the button and pressing the return key.

const onFormSubmit = e => {
  e.preventDefault();
  const { name, email } = this.state;
  // send to server with e.g. `window.fetch`
}

...

<form onSubmit={onFormSubmit}>
  ...
  <button type="submit">Submit</button>
</form>

Solution 2 - Reactjs

It's been quite a few years since this question was last answered. React introduced "Hooks" back in 2017, and "keyCode" has been deprecated.

Now we can write this:

  useEffect(() => {
    const listener = event => {
      if (event.code === "Enter" || event.code === "NumpadEnter") {
        console.log("Enter key was pressed. Run your function.");
        event.preventDefault();
        // callMyFunction();
      }
    };
    document.addEventListener("keydown", listener);
    return () => {
      document.removeEventListener("keydown", listener);
    };
  }, []);

This registers a listener on the keydown event, when the component is loaded for the first time. It removes the event listener when the component is destroyed.

Solution 3 - Reactjs

Use keydown event to do it:

   input: HTMLDivElement | null = null;

   onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {
      // 'keypress' event misbehaves on mobile so we track 'Enter' key via 'keydown' event
      if (event.key === 'Enter') {
        event.preventDefault();
        event.stopPropagation();
        this.onSubmit();
      }
    }
    
    onSubmit = (): void => {
      if (input.textContent) {
         this.props.onSubmit(input.textContent);
         input.focus();
         input.textContent = '';
      }
    }

    render() {
      return (
         <form className="commentForm">
           <input
             className="comment-input"
             aria-multiline="true"
             role="textbox"
             contentEditable={true}
             onKeyDown={this.onKeyDown}
             ref={node => this.input = node} 
           />
           <button type="button" className="btn btn-success" onClick={this.onSubmit}>Comment</button>
         </form>
      );
    }

Solution 4 - Reactjs

this is how you do it if you want to listen for the "Enter" key. There is an onKeydown prop that you can use and you can read about it in react doc

and here is a codeSandbox

const App = () => {
    const something=(event)=> {
        if (event.keyCode === 13) {
            console.log('enter')
        }
    }
return (
    <div className="App">
        <h1>Hello CodeSandbox</h1>
        <h2>Start editing to see some magic happen!</h2>
        <input  type='text' onKeyDown={(e) => something(e) }/>
    </div>
);
}

Solution 5 - Reactjs

import React, { useEffect, useRef } from 'react';

function Example() {

    let inp = useRef();
    useEffect(() => {
        if (!inp && !inp.current) return;
        inp.current.focus();
        return () => inp = null;
    });

    const handleSubmit = () => {
        //...
    }

    return (
        <form
            onSubmit={e => {
                e.preventDefault();
                handleSubmit(e);
            }}
        >
            <input
                name="fakename"
                defaultValue="...."
                ref={inp}
                type="radio"
                style={{
                    position: "absolute",
                    opacity: 0
                }}
            />
            <button type="submit">
                submit
            </button>
        </form>
    )
}

Enter code here sometimes in popups it would not work to binding just a form and passing the onSubmit to the form because form may not have any input.

In this case if you bind the event to the document by doing document.addEventListener it will cause problem in another parts of the application.

For solving this issue we should wrap a form and should put a input with what is hidden by css, then you focus on that input by ref it will be work correctly.

Solution 6 - Reactjs

If you don't have the form inside <form>, you could use this in componentDidMount():

componentDidMount = () => {
      document.addEventListener("keydown", (e) => 
        e.code === "Enter" && console.log("my function"))
    }
    
componentDidMount() //<-- remove this, it's just for testing here

Solution 7 - Reactjs

I've built up on @user1032613's answer and on this answer and created a "on press enter click element with querystring" hook. enjoy!

const { useEffect } = require("react");

const useEnterKeyListener = ({ querySelectorToExecuteClick }) => {
	useEffect(() => {
		//https://stackoverflow.com/a/59147255/828184
		const listener = (event) => {
			if (event.code === "Enter" || event.code === "NumpadEnter") {
				handlePressEnter();
			}
		};

		document.addEventListener("keydown", listener);

		return () => {
			document.removeEventListener("keydown", listener);
		};
	}, []);

	const handlePressEnter = () => {
		//https://stackoverflow.com/a/54316368/828184
		const mouseClickEvents = ["mousedown", "click", "mouseup"];
		function simulateMouseClick(element) {
			mouseClickEvents.forEach((mouseEventType) =>
				element.dispatchEvent(
					new MouseEvent(mouseEventType, {
						view: window,
						bubbles: true,
						cancelable: true,
						buttons: 1,
					})
				)
			);
		}

		var element = document.querySelector(querySelectorToExecuteClick);
		simulateMouseClick(element);
	};
};

export default useEnterKeyListener;

This is how you use it:

useEnterKeyListener({
	querySelectorToExecuteClick: "#submitButton",
});

https://codesandbox.io/s/useenterkeylistener-fxyvl?file=/src/App.js:399-407

Solution 8 - Reactjs

here is very optimised code

useEffect(() => {
	document
		.getElementById("Your-element-id")
		.addEventListener("keydown", function (event) {
			if (event.code === "Enter" || event.code === "NumpadEnter") {
				event.preventDefault();
				document.getElementById("submit-element").click();
			}
		});
}, []);

Solution 9 - Reactjs

use mousetrap
https://www.npmjs.com/package/mousetrap
https://www.npmjs.com/package/@types/mousetrap
(yeah, I know, unfortunatelly when You use typescript u have to install types aside from basic module)

import {bind} from 'mousetrap';

const handleSubmit = async () => {
// submit func here
};

bind(['enter', 'return'], handleSubmit);

other example of using mousetrap, maybe for other purpose:

bind(['command+k', 'ctrl+k'], function(e) {
    highlight([11, 12, 13, 14]);
    return false;
});

Solution 10 - Reactjs

So, I was looking for some solution around the same scenario where on the login page, after a user hits(press) enter button from keyboard should trigger login process.

You can configure the textbox with one of code,

<input
  // rest your code
  onKeyPress={ onkeyup }
/>

Please keep in mind I am using react hooks to achieve it, apart from that this link will help you understand more enter key event handler

Solution 11 - Reactjs

You may approach this problem like this.

   onKeyPress={e => e.key === 'Enter' && handleFormSubmit}

Solution 12 - Reactjs

Try this enter code here:

const enterKye=()=>{
if(e.key==="Enter"){
  alert("hello");
  }
}

<input type="text" onKeyPress={enterKye}>

Solution 13 - Reactjs

for example next React+TS code(add use hooks for state and etc):


type Props = {
...any properties
} & [any other type if need]

//I want notice that input data type of component maybe difference from type of props
const ExampleComponent: React.FC<Props> = (props: [Props or any other type]){
     const anySerice = new AnyService();

     const handleSubmit = async (eventForm) => {
        await anySerice.signUp();
     }

     const onKeyUp = (event: KeyboardEvent) => {
        //you can stay first condition only
        if (event.key === 'Enter' || event.charCode === 13) { 
            handleSubmit(event)
        }
    } 
    
    ...other code
    
    return (<Form noValidate validated={validated} className="modal-form-uthorize" onKeyPress={onKeyUp}>

    ...other components form

    </Form>)
}

export default ExampleComponent;

Solution 14 - Reactjs

I solved this problem by sent autoFocus property in button

   <button autoFocus={true}></button>

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
QuestionIstiak MorsalinView Question on Stackoverflow
Solution 1 - ReactjsDominicView Answer on Stackoverflow
Solution 2 - Reactjsuser1032613View Answer on Stackoverflow
Solution 3 - Reactjsam0waView Answer on Stackoverflow
Solution 4 - ReactjsCyrus ZeiView Answer on Stackoverflow
Solution 5 - ReactjsAmirView Answer on Stackoverflow
Solution 6 - ReactjsEmeeusView Answer on Stackoverflow
Solution 7 - ReactjsCodingYourLifeView Answer on Stackoverflow
Solution 8 - ReactjsSiddharth BagalView Answer on Stackoverflow
Solution 9 - ReactjsMarek KamińskiView Answer on Stackoverflow
Solution 10 - ReactjsPratibha RaiView Answer on Stackoverflow
Solution 11 - ReactjsAli RazaView Answer on Stackoverflow
Solution 12 - ReactjsProkash PulView Answer on Stackoverflow
Solution 13 - ReactjsPaul AlexeevView Answer on Stackoverflow
Solution 14 - ReactjsAleksandr ZelenskiyView Answer on Stackoverflow