Probar la solución de esta manera:
Cuando un usuario hace clic en la entrada de selección de archivos, darle el foco: $(el).focus()
.
Luego, cada vez que un usuario acceda a ESC, observe si el elemento $ (': focus') es la entrada de selección de archivos. En ese caso, desenfoque() esa entrada y no cierre el modal. Peor caso: el usuario quiere cerrar el modal, presiona ESC y no pasa nada [1]. Piensa "wtf", presiona ESC nuevamente y el modal se cierra como debería. Solo asegúrate de que la entrada de selección de archivos se enfoque en todos los casos posibles - tabulando a través de las entradas, etc. Si utilizas una herramienta de carga de terceros y lo que he dicho no funciona, investiga cómo la herramienta de subida ajusta la selección de archivos en un enlace o botón personalizado, y lo que en realidad recibe el evento de clic en diferentes casos (por ejemplo, cuando la pestaña, la entrada puede recibir el evento, al hacer clic, podría ser el enlace). En general, es manejable tener esto funcionando con la advertencia que he descrito.
Esto funciona con las -s demasiado ampliadas de manera similar (solo verifique que una selección no se enfoca cuando se toca ESC).
No podrá detectar todos los casos cuando necesite blur()
la entrada de selección de archivo. No es una solución entre navegadores. Incluso FF necesita ajustes para trabajar. He estado probando en webkit con resultados positivos, en otros navegadores podría no funcionar.
Creo que la mayoría de las personas presionan el botón "Cancelar" en lugar de la tecla ESC; algo que esta solución no es compatible. –