0

When a new page heading renders, I want to reset focus on that page, such that hitting <tab> will cause the browser to go to the focusable/tabbable element after this primary page heading.

Devin Rhode
  • 23,026
  • 8
  • 58
  • 72

1 Answers1

0
const PageTitle = ({title}) => {
  const titleHeaderRef = useRef(null as null | HTMLHeadingElement);
  useEffect(() => {
    if (titleHeaderRef.current !== null) {
      // First, make the element focus-able.
      titleHeaderRef.current.setAttribute('tabIndex', '-1');

      // Reset focus to this primary header.
      titleHeaderRef.current.focus();
      titleHeaderRef.current.blur();

      // Finally, make the element non-focus-able.
      titleHeaderRef.current.removeAttribute('tabIndex');

      // To see this behavior in action, wrap this dom calls in a 5 second setTimeout, and tab around the page before this timeout is hit.
    }
  }, []);

  return (
    <Typography ref={titleHeaderRef}>
      {title}
    </Typography>
  );
};
Devin Rhode
  • 23,026
  • 8
  • 58
  • 72
  • This SO page was helpful starting point: https://stackoverflow.com/questions/2520650/how-do-you-clear-the-focus-in-javascript – Devin Rhode Mar 28 '23 at 03:08