microsoft / tabster

Web Application Keyboard Navigation Tools
https://tabster.io
MIT License
121 stars 36 forks source link

[Feature request]: options to prevent focus on body when restore #411

Open YuanboXue-Amber opened 2 months ago

YuanboXue-Amber commented 2 months ago

Problem description:

Open this example: https://stackblitz.com/edit/vitejs-vite-ytxz4e?file=package.json,src%2FApp.tsx&terminal=dev

  1. Turn on NVDA
  2. Focus on the 'Trigger' button, press enter key, the 'close' button should be visible and focused
  3. Switch NVDA to forms mode, press enter key again, notice the screen reader announces 'document': image

This happens because the restore focus is async with a timeout. When switching the example to the react useEffect restore focus, this problem does not appear (and if setTimeout is used in react useEffect, it appears as well).

Possible solutions:

Option 1: provide the ability to synchronously focus on trigger - this was discussed in teams meeting and discarded because the trigger might not be focusable Option 2: provide the ability to focus on dummy input with aria-hidden when focus moves back to trigger.