Google Chrome closes <dialog> elements when Esc is pressed. Seems to be reacting to keydown.
Firefox does not. This is the expected behavior, as closing on any key press is easy to implement.
How to make Google Chrome leave dialogs open on Esc?
Please see fiddle https://jsfiddle.net/zeqo7kaf/1/
I have implemented window's, document's, body's, dialog's key events (up, down and pressed) to prevent propagation, however it seems to me that this is above dom events.
(in order to see dialogs in Firefox, go to about:config and set property dom.dialog_element.enabled to true).
You can try to use cancel event: MDN
dialog.addEventListener('cancel', (event) => {
event.preventDefault();
});
Modified JSFiddle: https://jsfiddle.net/7et3hf8p/
Since the cancel/close events fire after the fact, I got this working by adding a keydown listener to the document itself.
const handleKeyDown = (e) => {
if (e.key !== 'Escape') return;
if (!allowDialogDismiss) e.preventDefault();
}
useEffect(() => {
document.addEventListener('keydown', handleKeyDown);
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, [allowDialogDismiss]);
The dialog doesn't dismiss on ESC key press anymore.
I have a text input inside the dialog and pressing ESC by mistake would mean losing the text input before it is saved. This worked. I change the allowDialogDismiss state depending on the input's text.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With