hubert: browserspez. problem: „bitte warten“-nachricht nach dem submit

hallo Zusammen

ich hab' folgendes unangenehmes problem:

a) eingabe von formulardaten -> b) anzeige der formulardaten zur ueberpruefung der eingabe durch den user -> c) uebermitteln der formulardaten an der webserver

ich hab' also ein formular und will waehrend die daten vom server verarbeitet werden eine „bitte warten“-nachricht einbleinden und ein animiertes gif dazu.

in schritt c) hab' in einen container in dem zur kontrolle alle daten noch einmal schoen angezeigt werden. wenn das formular abgeschickt wird ersetz' ich mit JavaScript & innerHTML einfach den inhalt dieses containers mit meiner „bitte warten“-nachricht & dem animerten gif. ist das PHP-script fertig und schickt die antwortseite an den browser wird diese dargestellt.

so weit sogut... unter windows funktioniert das im FireFox, Opera und IE6 wunderbar.

unter windows&IE7 und unter LINUX (FireFox, Opera, Konqerer) leider nicht!

denn diese kombinationen wollen nach dem abschicken der formulardaten die neue seite sofort darstellen. somit blinkt kurz meine „bitte warten“-nachricht mit dem animerten gif auf und danach wird gleich die neue seite teilweise dargestellt.
unter windows verhalten sich die browser FireFox, Opera und IE6 jedoch anders und bauen die seite anscheinend erst auf sobald der komplette quellcode an den browser uebertragen wurde.

kann ich dieses verhalten clientseitig irgendwie beeinflussen?
oder gibt es evtl eine webserver einstellung dafuer (ich verwende Apache)?

mir erscheint eine AJAX loesung fuer so etwas am sinnvollsten leider ist mir solch ein ansatz fuer dieses projekt nicht moeglich.

  1. Moin!

    unter windows verhalten sich die browser FireFox, Opera und IE6 jedoch anders und bauen die seite anscheinend erst auf sobald der komplette quellcode an den browser uebertragen wurde.

    Nicht wirklich. Man kann als User z.B. in Opera einstellen, dass er die neue Seite erst nach Ablauf von ein oder mehreren Sekunden darstellt, in der Hoffnung, dass das Mehr an Daten zu diesem Zeitpunkt eine vollständigere erste Seitendarstellung erlaubt. Außerdem dürfte es die CPU schonen (sofern die sich nicht sowieso langweilt), wenn die Seite nicht sofort und mehrfach gerendert werden muß.

    kann ich dieses verhalten clientseitig irgendwie beeinflussen?
    oder gibt es evtl eine webserver einstellung dafuer (ich verwende Apache)?

    Die Sache ist "eigentlich" ganz einfach: Die Formulardaten werden abgeschickt, gespeichert, und sobald dein Skriptcode bei dem Teil mit der Ausgabe der Dankeseite angelangt ist, schickt der Webserver diese Seitenteile direkt an den Browser - und der stellt sie direkt dar.

    Wenn dein Skript also so schnell ist, dass dein "Bitte warten" nur kurz aufblitzt - dann ist es ja wohl offensichtlich unnötig, es einzublenden, oder?

    mir erscheint eine AJAX loesung fuer so etwas am sinnvollsten leider ist mir solch ein ansatz fuer dieses projekt nicht moeglich.

    Auch mit AJAX verhinderst du nicht, dass dein Server beim Provider das tut, wofür du vermutlich ausreichend Geld bezahlst: Schnell sein beim Antworten.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Wenn dein Skript also so schnell ist, dass dein "Bitte warten" nur kurz aufblitzt - dann ist es ja wohl offensichtlich unnötig, es einzublenden, oder?

      etwas Ausfuerhlicher:
      ich arbeite derzeit in einer testumgebung im produktivbetrieb kann es vorkommen das die webseite 30sek bis 60sek auf die antwort warten muss da externe services kontaktiert werden.

      derzeit habe ich in meiner testumgebung eine 10sek verzoegerung im serverseitigen skript eingebaut.

      bei den browser/betriebssystem kobinationen bei denen es funktioniert erscheint meine „bitte warten“-nachricht und bleibt 10sek lang. danach wird die erfolgs-/misserfolgsseite angezeit.

      bei den browser/betriebssystem kobinationen bei denen es nicht funktioniert blinkt die „bitte warten“-nachricht kurz auf und es wird sofort die erfolgs-/misserfolgsseite teilweise aufgebaut - bis zu der stelle an der die eigentlichen daten der antwort stehen wuerden. an dieser stelle bleibt die seite dann 10sek teilweise aufgebaut und baut sich komplett zusammen nachdem die restlichen daten (in der testumgebung eben nach 10sek) uebermittelt wurden.

      Auch mit AJAX verhinderst du nicht, dass dein Server beim Provider das tut, wofür du vermutlich ausreichend Geld bezahlst: Schnell sein beim Antworten.

      die antwort ist definitiv stark zeitverzoegert. eine asynchrone kommunikation waere da schon nicht schlecht. aber darum geht es ja hier leider nicht...

      1. Hallo,

        bei den browser/betriebssystem kobinationen bei denen es nicht funktioniert blinkt die „bitte warten“-nachricht kurz auf und es wird sofort die erfolgs-/misserfolgsseite teilweise aufgebaut - bis zu der stelle an der die eigentlichen daten der antwort stehen wuerden. an dieser stelle bleibt die seite dann 10sek teilweise aufgebaut und baut sich komplett zusammen nachdem die restlichen daten (in der testumgebung eben nach 10sek) uebermittelt wurden.

        das heißt im Klartext: Dein Server antwortet quasi sofort auf den Request und sendet schon die ersten Bröckchen der Antwortseite.

        Je nachdem, wie die Browser programmiert und konfiguriert sind, kann es nun sein, dass sie dieses Fragment sofort interpretieren und anzeigen, soweit möglich, oder dass sie erst eine gewisse Mindest-Datenmenge puffern, bevor sie anfangen, die Seite zu rendern.

        Sorge also dafür, dass serverseitig _keine_ Ausgabe an den Client erfolgt, solange die Daten aus der Datenbank (oder Berechnung, whatever) noch nicht vorliegen. Im Klartext: Puffere die Ausgabe serverseitig, oder halte dich konsequent an das EVA-Prinzip (Eingabe, Verarbeitung, Ausgabe), nach dem die Ausgabe erst beginnen soll, wenn die Verarbeitung und Aufbereitung komplett abgeschlossen ist.

        So long,
         Martin

        --
        Faulheit ist, mit dem Cocktailshaker in der Hand auf das nächste Erdbeben zu warten.
        1. morgen!

          Sorge also dafür, dass serverseitig _keine_ Ausgabe an den Client erfolgt, solange die Daten aus der Datenbank (oder Berechnung, whatever) noch nicht vorliegen. Im Klartext: Puffere die Ausgabe serverseitig, oder halte dich konsequent an das EVA-Prinzip (Eingabe, Verarbeitung, Ausgabe), nach dem die Ausgabe erst beginnen soll, wenn die Verarbeitung und Aufbereitung komplett abgeschlossen ist.

          hab gestern abend noch auf die schnelle eben diesen ansatz ausprobiert. sah sehr vielversprechend aus. leider wirft mir das den bisher geschriebenen code ziemlich durcheineander.
          aber damit muss man rechnen wenn man alte projekte erweitert.

          danke fuer eure tipps!

      2. Hi hubert,

        ich arbeite derzeit in einer testumgebung im produktivbetrieb kann es vorkommen das die webseite 30sek bis 60sek auf die antwort warten muss da externe services kontaktiert werden.

        Ich halte das für den falschen Ansatz und fürchte, dass du damit nicht browserübergreifend zum Erfolg kommen wirst.

        Wenn du mit remote Services arbeiten willst, dann solltest du IHMO wie folgt vorgehen:

        - Request an den Server senden, Server antwortet mit OK

        Client                                 Server
         - kontaktiere Server                   - kontaktiere remote Service
         - solange Server kein OK antwortet     - solange remote-Service noch nicht geantwortet hat
           - warte 10 Sekunden                    - beantworte jegliche Requests mit FEHLER
           - kontaktiere Server erneut          - sonst beantworte Request mit OK + Daten
         - verarbeite Antwort

        Kurz gesagt: Du startest auf dem Server einen Job im Background, welcher die Informationen besorgt und fragst mit dem Client (per AJAX) regelmäßig an, ob die Antworten schon vorhanden sind.

        Background PHP-Prozesse starten kannst du mit PCNTL machen (sofern auf deinem Server installiert), ansonsten mit einem Eintrag in eine Datenbank, welcher von einem regelmäßig laufenden Script ausgelesen und abgearbeitet wird.

        Viele Grüße,
          ~ Dennis.