Potrzebuję rozwiązania dla różnych przeglądarek do następującego przypadku użycia: Użytkownik klika przycisk "eksport" na jednej z naszych stron, co powoduje otwarcie wyskakującego okienka z formularzem. Po przesłaniu formularza użytkownik powinien otrzymać plik binarny do pobrania (na przykład plik CSV), a okno podręczne powinno zostać zamknięte bez zmiany widocznej zawartości okna nadrzędnego.Jak zapewnić (w IE i Firefox) pobranie pliku binarnego w popupie, który się zamyka?
Nie możemy użyć limitu czasu, aby zamknąć popup, ponieważ zazwyczaj istnieje okno dialogowe z pytaniem użytkownika o obsługę pliku przed jego pobraniem, a nie ma możliwości sprawdzenia, jak długo zajmie użytkownikowi obsłużenie tego okna dialogowego .
Pierwotnie mieliśmy skrypt w popup, który ustawia window.location do adresu URL pliku do pobrania. To pozostawia niezamknięte okienko.
Tak więc próbowałem umieścić ukrytą ramkę iFrame w oknie nadrzędnym i mając wyskakujące okienka ustawić src iFrame na URL pobierania przed wywołaniem self.close(). Działa to doskonale w Firefoksie, ale IE całkowicie niszczy go ograniczeniami bezpieczeństwa.
Czy jest to właściwy sposób? Co powiesz na sposób, który działa na IE?
Aktualizacja - problem rozwiązany
Odpowiedzi proponowane tutaj nie były zbyt daleko, ale mój problem był nieco bardziej skomplikowane niż tylko bycie Javascript problem. Napotkałem błędy w IE i Excelu (ponieważ plik do pobrania to CSV), a popup robił post.
Nie mogłem rozwiązać problemu bez dołączania danych formularza do adresu URL (w przypadku GET zamiast POST), i muszę ustawić witrynę jako zaufaną w IE (jest to aplikacja dla przedsiębiorstw, więc jest to uzasadnione wniosek do użytkowników).
Po kliknięciu przycisku formularza wyskakujące okienko wywołuje funkcję na window.opener, przekazując w formularzu i adres URL działania. Następnie wyskakujące wywołania window.close(). Funkcja dodaje dane formularza do adresu URL i ustawia window.location na nowy adres URL (idea iFrame nigdy nie działała dobrze w IE i najwyraźniej nie była konieczna).
W odpowiedzi na adres URL formularza, nagłówki żądań zawierają: Content-Type: application/octetstream i Content-Disposition "," attachment; filename = plik.csv”.
byłoby działać, aby umieścić formularz na oryginalnej stronie lub skierować nową stronę do otwarcia w iframe (która mogłaby zostać wygenerowana przez sam skrypt)? – Anonymous
W odpowiedzi na Anonim - myślę, że to, co opisujesz, jest czymś, co zrobiłem. Wyskakujące okienko po utworzeniu i początkowym załadowaniu faktycznie zapisuje niewidoczny element iFrame na stronie nadrzędnej. Gdy formularz zostanie przesłany w wyskakującym okienku, kieruje iFrame, aby załadować pobrany plik. Moja IE (IE 6) zablokowała to i zmusiła mnie do potwierdzenia pobierania w oknie nadrzędnym. Po potwierdzeniu próbuje ponownie przesłać formularz okna nadrzędnego, który wywołuje kolejne okno dialogowe potwierdzenia i generalnie je kasuje. –
Zastanowiłem się nad przesłaniem formularza do elementu iframe, który pozbywa się problemu z wyskakującym wyskakującym okienkiem. – Anonymous