2009-05-07 7 views
5

Ich brauche eine Cross-Browser-Lösung für den folgenden Anwendungsfall: Der Benutzer klickt auf eine Schaltfläche „Exportieren“ auf einem unseren Seiten, die mit einem Formular ein Popup öffnet. Nach dem Absenden des Formulars sollte der Benutzer eine Binärdatei herunterladen (z. B. eine CSV-Datei), und das Popup sollte geschlossen werden, ohne den sichtbaren Inhalt des übergeordneten Fensters zu ändern.Wie stelle ich (in IE und Firefox) einen Binärdatei-Download in einem Popup bereit, das schließt?

Wir können kein Zeitlimit verwenden, um das Popup zu schließen, da normalerweise ein Dialog den Benutzer fragt, wie er mit der Datei umgehen soll, bevor er heruntergeladen wird, und man nicht wissen kann, wie lange der Benutzer mit diesem Dialog verfahren muss .

Wir hatten ursprünglich ein Skript in dem Popup, das window.location auf die Download-Datei URL setzt. Dadurch bleibt das Popup nicht geschlossen.

So dann habe ich versucht, in das übergeordnete Fenster ein verstecktes IFrame setzen und mit der Popup der iFrame des src auf die Download-URL festlegen, bevor self.close() aufrufen. Das funktioniert perfekt in Firefox, aber IE macht es mit Sicherheitseinschränkungen komplett kaputt.

Gibt es einen richtigen Weg, dies zu tun? Wie wäre es mit einer Methode, die auf IE funktioniert?


Update - Problem gelöst

Die Antworten hier vorgeschlagene sich nicht zu weit waren, aber mein Problem war ein wenig komplexer als nur ein Javascript Problem zu sein. Ich stieß auf Fehler mit IE und Excel (da die Download-Datei CSV ist), und das Popup war ein Formular Post.

Ich konnte das Problem nicht lösen, ohne die Formulardaten an eine URL anzuhängen (für ein GET anstelle eines POST), und ich muss die Site als vertrauenswürdig in IE setzen (das ist eine Unternehmensanwendung, also ist das ein vernünftiger Anfrage an die Benutzer).

Auf dem Klicken der Schaltfläche Formular, ruft die Popup-Funktion auf window.opener in Form und seine Action-URL übergeben. Dann ruft das Popup window.close() auf. Die Funktion fügt die Formulardaten an die URL an und setzt window.location auf die neue URL (die iFrame-Idee hat im IE nie gut funktioniert und war anscheinend nicht notwendig).

In der Antwort auf die Form URL enthält die Request-Header Content-Type: application/octetstream und Content-Disposition "" attachment; filename = dateiname.csv“.

+0

würde es funktionieren, entweder das Formular auf der ursprünglichen Seite oder direkt die neue Seite in einem iframe öffnen (was könnte aus Skript selbst erstellt werden)? – Anonymous

+0

Als Antwort auf Anonymous - ich denke, was Sie beschreiben, ist eine Art von dem, was ich getan habe. Das Popup schreibt bei der Erstellung und dem anfänglichen Laden tatsächlich einen unsichtbaren iFrame in die übergeordnete Seite. Wenn das Formular im Popup-Fenster gesendet wird, weist es den iFrame an, die Download-Datei zu laden. Mein IE (IE 6) blockierte dies und zwang mich, den Download im Elternfenster zu bestätigen. Bei der Bestätigung versucht es das Formular des Elternfensters erneut zu senden, was einen weiteren Bestätigungsdialog hervorruft und es allgemein durcheinander bringt. –

+0

Ich habe überlegt, das Formular an einen Iframe zu senden, der das Popup-Problem beseitigt. – Anonymous

Antwort

0

Dies könnte der ein Weg sein, um das Problem zu nähern.

1) Popup Form onsubmit tut ein window.open zu einem dritten Fenster, das eine Seite öffnet, das eine leere Seite ist, dass nur gibt die heruntergeladene Datei.

2) In Ihrem Javascript im Popup-Formular mit der rechten, nachdem Sie die window.open tun, deine Eltern-Fenster aufrufen (das erste Fenster) -Methode, die das Popup einreichen Formular schließt.

3) Auf der dritten Seite, das ist nur die Seite, die die Datei zurückgibt, Sie die Content-Disposition in Ihrer Header-Datei, um nur die Datei und Noth zurück Ansonsten wird die Seite nicht wirklich geöffnet. Hier

einige Informationen über den Header Sie benötigen. Der Code ist in Classic prähistorischen ASP, aber Sie sollten in der Lage sein zu glänzen, was Sie brauchen.

http://classicasp.aspfaq.com/general/how-do-i-prompt-a-save-as-dialog-for-an-accepted-mime-type.html

Hoffnung, das hilft.

+0

Ich bin mir nicht sicher, Schritt 1 würde in meinem Fall funktionieren, weil die Formularübergabe im Popup tatsächlich die Datei zum Herunterladen generiert und benennt. Bis ich die Ergebnisse dieser Einreichung bekomme, kann ich das dritte Fenster nicht öffnen, weil ich die Download-URL nicht kenne. Das ist ein lösbares Problem, aber ich hatte gehofft, das Datei-Download-Servlet selbst nicht anfassen zu müssen, da es sich um einen Bugfix in unserem Entwicklungszyklus handelt. –

1

Haben Sie versucht, in der Iframe-Lösung tatsächlich eine Methode im übergeordneten Fenster aufzurufen, die wiederum den Speicherort des Iframes festlegen wird? Ich frage, weil es in meinen Tests gearbeitet:

Übergeordnetes Fenster

<html> 
<head> 
<script type="text/javascript"> 
var w; 

var download = function() { 
    document.frames[0].location = "test.php"; 
    w.close(); 
}; 

var o = function() { 
    w = window.open("test2.html", "window_name"); 
    return false; 
}; 
</script> 
</head> 
<body> 

<a href="#" onclick="return o();">open</a> 

<iframe></iframe> 

</body> 
</html> 

Popup-Fenster

<html> 
<head> 
<script type="text/javascript"> 
var download = function() { 
    window.opener.download(); 
    return false; 
}; 
</script> 
</head> 
<body> 

<a href="#" onclick="return download();">download</a> 

</body> 
</html> 

test.php ist nur eine Seite, die eine Datei zwingt Zum Download, und bitte beachten Sie, dass der obige Code IE-spezifisch ist, da ich das document.frames-Objekt verwende, aber es kann einfach über den Browser erstellt werden.

+0

Zum Zeitpunkt der Generierung der übergeordneten Seite ist die Dateidownload-URL nicht bekannt. Ich nehme an, dass es an die download() Funktion übergeben werden könnte. Ich muss das versuchen (Anfang nächster Woche, aufgrund meines Zeitplans). –

+0

Die Funktion download() im Opener hat die Dinge nicht repariert. Der IE blockiert und kompromittiert den Downloadprozess komplett. Der nächste Schritt für mich besteht darin, das Formular im iFrame zu laden und nicht im Popup. –

+0

Welche Version von IE? –

-1

Es gibt keine perfekte Lösung dafür. Wenn das IE-Popup heruntergeladen und direkt in Firefox heruntergeladen wird, würde es funktionieren