Frage

Ich habe eine Schaltfläche, die window.location auf eine PHP-Datei setzt die einen Feed generiert, die dann heruntergeladen wird. Da jedoch die Dateien in der Größe aufgrund variieren, welche Daten in das Futter gesetzt wird, kann es manchmal eine Weile aus dem Klick auf den Button, um die Datei-Dialog nehmen Aufspringen.

Was würde ich zu tun, um die Lage sein mag, ist die Schaltfläche klicken und eine loading.gif bis zum Dialog anzeigen / Datei abgeschlossen ist.

Irgendwelche Ideen wäre cool!

Prost

War es hilfreich?

Lösung

Sie einfach das Skript Bild anzeigen RSS Erzeugungs machen Sie wollen (Ausgabebild des HTML, dann bündig Ausgangspuffer und Datengenerierung starten). Am Ende der Datenerzeugung zu tun:

<?php
print '<script>window.location = "http://www.newlocation.com"</script>'

Das ist alles.

Andere Tipps

Ich bin nicht wirklich sicher, warum Sie die Größe der Datei überhaupt überprüfen müssen? Wenn Sie AJAX verwenden, um dynamisch die Get / Post zu tun, und alles, was Sie tun versucht, ein Ladesymbol zu zeigen, während dies geschieht, sein ziemlich einfach zu einer asynchronen Aktivitätsanzeige erbrechen. Zum Beispiel mit jquery:

$("#loading").ajaxStart(function(){
   $(this).show();
});

$("#loading").ajaxStop(function(){
   $(this).hide();
});

$("#feeds").load("feeds.php?id=89734258972347895");

Der obige Code setzt ein DOM-Objekt mit der ID „Laden“ ein- und ausgeblendet, wenn eine asynchrone Anforderung initiiert wurde und gestoppt. .load (url) lädt den Inhalt der URL in die div #feeds. Wenn Sie den Content-Disposition setzen: attachment-Header mit PHP, wird es automatisch eine Datei herunterladen Fenster initiieren, obwohl sie asynchron in ein div geladen wurde. Dies ist auch möglich, ohne jquery natürlich, gibt es nur einen Haufen von Browser-Kompatibilität JavaScript und es ist nicht so einfach, wie einfach die ajaxStart und ajaxStop Ereignisse abonnieren Ihren Laden img ein- und ausblenden.

Josh

, bevor Sie window.location Sie eine versteckte div mit gif anzeigen können

Es ist alte Schule, aber dies kann sehr leicht mit Server-Push erfolgen

<?php
  $separator = "end_of_section_marker";
  header('Content-type: multipart/x-mixed-replace;boundary=$separator');
  print "\n--$separator\n";
  print "Content-type: text/html\n\n";
  // Send placeholder message here
  print "--$separator\n";
  ob_flush();
  flush();
  // Start long processing here
  print "Content-type: text/html\n\n";
  // send data here
  print "--$separator--\n";
?>

justieren Sie die Content-Typen für die Daten, die Sie senden. $ Kann Separator eines beliebigen Wert sein, solange es scheint nicht in den Daten gesendet werden.

Eine Methode, die ich in der Vergangenheit verwendet habe funktioniert wie folgt ...

  • Stellen Sie window.location zu einer Ladeseite und die Zielseite im Abfragezeichenfolgeflag passieren. Die Lade Seite soll ein animiertes Gif angezeigt werden oder was auch immer Sie bevorzugen, dass die Verarbeitung zu demonstrieren stattfindet. Die Lade Seite soll sofort auf die Zielseite in der Abfragezeichenfolgeflag weitergegeben umleiten (zusammen mit allen anderen anwendbaren Abfragezeichenfolgeflag Parametern).

EDIT: Die Ladeseite zur Zielseite mit Hilfe von Javascript (set window.location auf die URL in der Abfragezeichenfolgeflag zur Verfügung gestellt) umleiten soll. Dies ist ein wichtiger Punkt, denn wenn man auf der Server-Seite umleiten wird die Lade Seite nicht angezeigt bekommen.

EDIT 2: eine geschätzte Downloadzeit für den Benutzer Wenn der Laden Seite eine PHP-Datei ist, können Sie das Kontrollgröße zu-werden heruntergeladene Datei und angezeigt wird (zusammen mit einem animierten „Laden“ gif) oder Dingsbums.

  • Die Zielseite sollte mit Pufferung aktiviert (Call ob_start (), bevor Sie Inhalte machen) machen. Mit Pufferung aktiviert ist, wird nichts an den Browser gesendet, bis die gesamte Seite gerendert wird. Inzwischen Ihre Lade Seite aus Schritt 1 wird auch weiterhin angezeigt werden.

Sie haben AJAX zu verwenden, um den Server zu kommunizieren, um die genaue Größe der Datei, die Sie den Download zu entdecken. Dann haben Sie etwas zu testen gegen. Es gibt keine Möglichkeit, nur die Größe der erwarteten Nutzlast von der Client-Seite zu wissen.

Ist es möglich, dass Sie ein iframe zu verwenden, um das Futter zu laden und dann überprüfen Sie die Readystate des iframe / Dokument ein Intervall mit? So dass der Prozess wäre:

  • Laden ein Fenster ein iframe von Breite und Höhe von 100% und ein über den loading.gif iframe enthält.
  • einen Timer einstellen, für die iframe.contentWindow.document.readyState Eigenschaft überprüfen
  • Sobald Readystate == abgeschlossen ist, zeigt den Dateidialog speichern.

Ein Nachteil ist, für die meisten Browser würde die PHP-Datei auf der gleichen Domäne sein müssen (auf IE können Sie einfach die Readystate überprüfen Eigenschaft des iframe).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top