Necesito una solución de navegador cruzado para el siguiente caso de uso: El usuario hace clic en un botón "exportar" en una de nuestras páginas, que abre una ventana emergente con un formulario. Al enviar el formulario, el usuario debe recibir una descarga de archivo binario (un archivo CSV, por ejemplo), y la ventana emergente debe cerrarse sin cambiar el contenido visible de la ventana principal.¿Cómo proporcionar (en IE y Firefox) una descarga de archivo binario en una ventana emergente que se cierra?
No podemos utilizar un tiempo de espera para cerrar la ventana emergente, porque generalmente hay un cuadro de diálogo que le pregunta al usuario cómo manejar el archivo antes de descargarlo, y no hay forma de saber cuánto le tomará al usuario manejar este diálogo .
Originalmente teníamos un script en la ventana emergente que establece window.location en la URL del archivo de descarga. Eso deja la ventana emergente sin cerrar.
Así que traté de poner un iFrame oculto en la ventana principal y tener la ventana emergente establecer iFrame's src en la URL de descarga antes de llamar a self.close(). Eso funciona perfectamente en Firefox, pero IE lo destruye por completo con restricciones de seguridad.
¿Hay una forma correcta de hacerlo? ¿Qué tal una forma que funciona en IE?
Actualización - problema resuelto
Las respuestas que aquí se proponen no fueron demasiado lejos, pero mi problema era un poco más complejo que simplemente ser una cuestión Javascript. Encontré errores con IE y Excel (ya que el archivo de descarga es CSV) y la ventana emergente estaba haciendo una publicación de formulario.
No pude resolver el problema sin anexar los datos del formulario a una URL (para un GET en lugar de un POST) y tengo que configurar el sitio como confiable en IE (esta es una aplicación empresarial, eso es razonable solicitud de hacer de los usuarios).
Al hacer clic en el botón de formulario, la ventana emergente llama a una función en window.opener, pasando el formulario y su URL de acción. Luego, la ventana emergente llama a window.close(). La función agrega los datos del formulario a la URL y establece window.location a la nueva URL (la idea de iFrame nunca funcionó bien en IE y aparentemente no fue necesaria).
En la respuesta a la URL del formulario, los encabezados de solicitud incluyen Content-Type: application/octetstream y Content-Disposition "," attachment; archivo = filename.csv".
¿Funcionaría ya sea para poner el formulario en la página original o dirigir la nueva página para abrir en un iframe (que podría generarse desde el script)? – Anonymous
En respuesta a Anonymous: creo que lo que describes es algo así como lo que hice. La ventana emergente, en la creación y carga inicial, en realidad escribe un iFrame invisible en la página principal. Cuando se envía el formulario en la ventana emergente, ordena al iFrame que cargue el archivo de descarga. Mi IE (IE 6) bloqueó esto y me obligó a confirmar la descarga en la ventana principal. En la confirmación, intenta volver a enviar el formulario de ventana principal, lo que abre otro cuadro de diálogo de confirmación y generalmente lo desordena. –
Estaba pensando en enviar el formulario a un iframe, que elimina el problema persistente emergente. – Anonymous