Ich erstelle ein Iframe und setze dynamisch die URL einer Seite, die eine Binärdatei (xls, doc...) herunterlädt. Während die Dateien heruntergeladen werden, zeige ich eine Animation. Wenn dies nicht der Fall ist, verstecke ich sie.
Das Problem ist, dass Chrome nicht weiß, wann die Dateien vollständig heruntergeladen sind, also wenn das Iframe vollständig geladen ist. Ich benutze die Iframe-Eigenschaft readyState
, um den Status des Iframes zu überprüfen:
var iframe = document.createElement("iframe");
iframe.style.visibility = "hidden;
// Ich starte eine Fortschrittsanimation
window.setTimeout(showProgressAnimation, 1000);
// Ich starte den Dateidownload
iframe.src ='GetFile.aspx?file=' + fileName;
document.body.appendChild(iframe);
function showProgressAnimation() {
if (iframe.readyState == "complete" || iframe.readyState == "interactive") {
// Ich stoppe die Animation und zeige die Seite
animation.style.display = 'none';
progressBar.hide();
$('#page').show();
}
else {
// Chrome gelangt immer zu dieser Zeile
window.setTimeout(showProgressAnimation, 1000);
}
}
Das Ergebnis ist also eine Endlosschleife.
Ich habe Folgendes versucht und es funktioniert in Firefox und Chrome nicht, wenn der Inhalt eine Binärdatei ist:
if ($.browser.mozilla || $.browser.webkit ) {
iframe.onload = function showProgressAnimation() {
animation.style.display = 'none';
progressBar.hide();
$('#page').show();
}
}
// IE
else{
window.setTimeout(showProgressAnimation, 1000);
}