admin管理员组文章数量:1304891
I'm building a website using Next.js, and currently I'm trying to get a simple function to run when pressing a key. The problem I'm having is that the onKeyDown event isn't being triggered like I expected. My code is as follows:
<main onKeyDown={e => console.log("Key pressed")}>
Currently it's placed in the "main" element, which is the top root element of this ponent. I've tried placing the onKeyDown event in many of the other elements as well, without luck. I'm not sure if it's the placement which causes issues or my lack of understanding of how to use this event. Any help would be appreciated.
As for now I simply want it to write something in the console so that I can see that it triggers. I've tried using onKeyPress instead, as well as assigning a function to the event instead of a lambda expression, which shouldn't make a difference.
I'm building a website using Next.js, and currently I'm trying to get a simple function to run when pressing a key. The problem I'm having is that the onKeyDown event isn't being triggered like I expected. My code is as follows:
<main onKeyDown={e => console.log("Key pressed")}>
Currently it's placed in the "main" element, which is the top root element of this ponent. I've tried placing the onKeyDown event in many of the other elements as well, without luck. I'm not sure if it's the placement which causes issues or my lack of understanding of how to use this event. Any help would be appreciated.
As for now I simply want it to write something in the console so that I can see that it triggers. I've tried using onKeyPress instead, as well as assigning a function to the event instead of a lambda expression, which shouldn't make a difference.
Share Improve this question asked Mar 24, 2022 at 13:19 NoobsterNoobster 1882 silver badges10 bronze badges 3-
1
You may need to put the event listener on
window
ordocument
if you're trying to capture all key down events on the page. Unless you can focus "main" somehow, I'm not sure it will capture that event type. – tarrball Commented Mar 24, 2022 at 13:27 -
1
@tarrball Well my initial approach was this:
globalThis.addEventListener("keydown", e => { // do stuff })
But I quickly found out this made it trigger from all pages on the website. But thanks, I'll see if I can get something like that to work. – Noobster Commented Mar 24, 2022 at 13:31 -
1
I got it to work by simply setting tabIndex attribute of <main> to -1:
<main tabIndex={-1} onKeyDown={handleKeyDown}>
Passing it a function handleKeyDown instead is unrelated. – Noobster Commented Mar 24, 2022 at 13:40
1 Answer
Reset to default 8In your ponent, use useEffect
to add(and remove) the event listener to the document.
import { useEffect } from 'react'
// etc...
const Component = () => {
useEffect(() => {
const keyDownHandler = (e) => console.log(`You pressed ${e.code}.`);
document.addEventListener("keydown", keyDownHandler);
// clean up
return () => {
document.removeEventListener("keydown", keyDownHandler);
};
}, []);
return <main>Press a key</main>;
};
You may even make a custom hook (beware of the dependency list):
import { useEffect } from 'react'
// etc...
const useKeyDown = (handler, deps = []) => {
useEffect(() => {
document.addEventListener("keydown", handler);
// clean up
return () => {
document.removeEventListener("keydown", handler);
};
}, deps);
};
const Component = () => {
useKeyDown((e) => console.log(`You pressed ${e.code}.`), []);
return <main>Press a key</main>;
};
本文标签: javascriptHow can I get onKeyDown event to work in NextjsReactStack Overflow
版权声明:本文标题:javascript - How can I get onKeyDown event to work in Next.jsReact - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741759988a2396346.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论