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“.
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
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. –
Ich habe überlegt, das Formular an einen Iframe zu senden, der das Popup-Problem beseitigt. – Anonymous