2010-03-16 23 views
8

Quiero iniciar una descarga de archivos para un usuario cuando hace clic en un enlace, pero tengo un controlador onbeforeunload que no quiero invocar cuando comienza la descarga. Para las descargas, actualmente tengo un <a> con el href configurado en la ubicación del archivo, pero al hacer clic en él, se invoca el onbeforeunload en Chrome (aunque no en FF).Descargar binario sin activar onbeforeunload

Sé que puedo establecer una bandera privada y verificar que en el controlador onbeforeunload, pero ¿hay alguna manera de iniciar la descarga con ajax? Todavía quiero que el usuario vea los cuadros de diálogo habituales cuando descargan el archivo (Abrir/Guardar, etc.).

Ideas?

Respuesta

3

Supongo que usar el atributo de destino en el enlace podría hacer el truco.

<a href="http://www.example.com/somefile.zip" target="_blank">download</a> 

no validará (a menos que el uso de marcos tipo de documento), pero que podría funcionar .. Se va a crear una nueva pestaña o ventana emergente y luego una descarga de archivos (si la cabecera http dice que debería), pero podría dejar las nuevas pestañas/ventanas se abren, o podría cerrarlas después de guardar ...

Por otro lado, creo que tener un controlador onbeforeunload que a veces no desee desencadenar suena sospechoso, ¿por qué lo necesita de todos modos?

+1

Gracias, pensé en esto, pero la pestaña abierta permanece en blanco y se sienta, que no es la experiencia que preferiría. Necesito el controlador onbeforeunload para pedir al usuario que guarde las modificaciones sin cambios (como en SO) – psychotik

3

Sé que esta respuesta es muy tarde, pero hay una solución simple. Cree un iframe dinámicamente y establezca el "src" del mismo en su url de descarga a través de JavaScript. Esto iniciará la descarga sin activar el evento de descarga (creo).

10

La mejor manera de hacerlo es construyendo un iframe y desencadenando la descarga desde allí.

He probado en Chrome, IE6 + y Firefox y este enfoque parece funcionar en todos ellos.

código Ejemplo:

function DownloadFile(filePath) { 
    var downloadIframe = $('<iframe />', 
     { 
      id : 'downloadIframe'   
     }).appendTo('body'); 
    downloadIframe.attr('src',filePath'); 
} 

Esto sólo funcionará correctamente para el que está de descarga (como hemos duro codificado un id), si está desencadenando múltiples descargas, entonces le sugiero que vuelva a utilizar el marco flotante por almacenándolo en una variable más ampliamente accesible.

+0

Una aplicación que trabajo en los registros de datos del navegador. Esto corrigió un error en nuestros datos. ¡Gracias! – Hcabnettek

+0

¿Agregará un iFrame a su cuerpo? Agregue espacio en blanco abajo? – theB3RV

+0

A partir de enero de 2017, creo que la solución de Felix es la mejor – veered

7

agregar el atributo a la download una etiqueta, que parece impedir que se dispare onbeforeunload:

<a download href="mysite.com"></a> 

De this answer.

Cuestiones relacionadas