2010-03-16 15 views
8

Desidero avviare un download di file per un utente quando fa clic su un collegamento, ma ho un gestore onbeforeunload che non desidero richiamare all'avvio del download. Per i download, attualmente ho un <a> con il href impostato sul percorso del file ma facendo clic su esso si ottiene onbeforeunload invocato in Chrome (non in FF, però).Download binario senza attivazione onbeforeunload

So che posso impostare una bandiera privata e controllare che nel gestore onbeforeunload, ma c'è un modo per dare il via al download utilizzando ajax? Voglio comunque che l'utente visualizzi le solite finestre di dialogo quando scaricano il file (Apri/Salva ecc.).

Idee?

risposta

3

Direi che usare l'attributo di destinazione sul link potrebbe fare il trucco.

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

Non verranno ritenute valide (a meno di utilizzare frame doctype), ma potrebbe funzionare .. Si creerà una nuova scheda o finestra e poi pop un file di download (se l'intestazione http dice dovrebbe), ma potrebbe lasciare le nuove schede/finestre si aprono, o potrebbe chiuderle dopo averle salvate ...

D'altra parte penso che avere un gestore onbeforeunload che a volte non si desidera attivare suoni sospetti, perché è necessario comunque?

+1

Grazie, ho pensato a questo, ma la scheda aperta rimane vuota e si siede intorno, che non è l'esperienza che preferirei. Ho bisogno del gestore onbeforeunload per chiedere all'utente di salvare modifiche invariate (come su SO) – psychotik

3

So che questa risposta è davvero tardiva, ma c'è una soluzione semplice. Crea un iframe in modo dinamico e imposta "src" nell'URL di download tramite JavaScript. Questo darà il via al download senza attivare l'evento di scarico (credo).

10

Il modo migliore per farlo è in effetti costruendo un iframe e attivando il download da lì.

Ho testato su Chrome, IE6 + e Firefox e questo approccio sembra funzionare in tutti.

codice Esempio:

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

Questo funziona correttamente solo per un one off scaricare (come abbiamo hard coded un id), se si sta innescando download multipli, allora vi consiglio di riutilizzare l'iframe da memorizzandolo in una variabile più accessibile.

+0

Un'app che lavoro sui dati del browser dei record. Questo ha corretto un bug nei nostri dati. Grazie! – Hcabnettek

+0

Aggiungendo un iFrame al tuo corpo aggiungi uno spazio vuoto di seguito? – theB3RV

+0

A partire da gennaio 2017, penso che la soluzione di Felix sia la migliore – veered

7

Aggiungere l'attributo download al un tag, che sembra impedire onbeforeunload da sparo:

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

Da this answer.

Problemi correlati