Autor Zpráva
quatzael
Profil
Jde mi o to, že když se odešle formulář, tak je tam spousta dat, které trvá zpracovat a proto tam chci mezi tím hodit spinner. Ale úplně mi není jasný jak to vyřešit. Na stránce A odesílám formulář pomocí POST přímo na stránku B (script PHP). Zpracování formuláře chvíli trvá a chtěl bych, aby se hned po odeslání na stránce objevil spinner a po načtení stránky zmizel pochopitelně.

O to jak to vyřešit graficky mi teď nejde. Spíš jak udělat to, aby se ten spinner objevil hned po odeslání a ne až po zpracování dat..
Chamurappi
Profil
Reaguji na quatzaela:
Zobrazíš ho skriptem při události onsubmit.
Můžeš pak ovšem narazit na problém, že pokud uživatel po přejití na novou stránku zmáčkne Zpět, ocitne se na formuláři s tvojí animací, aniž by se cokoliv odesílalo. Což nemá úplně triviální řešení.
_es
Profil
Chamurappi:
Zobrazíš ho skriptem při události onsubmit.
Ale potom predsa nebude formulár odoslaný. A ak bude odoslaný neskôr cez JS metódou submit formulára, tak to bude fungovať rovnako, len oneskorené o tú animáciu.

quatzael:
Čo tak dať tú animáciu na „stránku B“ tak, aby bežala čo najskôr po začatí spracovania stránky? A spraviť PHP kód „stránky B“ tak, aby čo najskôr odoslal dáta na zobrazenie animácie a potom začal pracovať na „spracovaní formulára“? Odoslanie formulára, pokiaľ nie je odoslaný do iframe či nového okna, zároveň „ruší“ celú aktuálnu stránku (aj s JS) a začne sa načítavať odpoveď servera, teda po ňom nemôžu bežať nejaké animácie na aktuálnej stránke.
quatzael
Profil
_es:
No jo, ale fakticky po odeslání formuláře ta stránka A tam zůstává furt zobrazená.. Teprve až se data zpracují začne se načítat obsah stránky B..


_es:
Takhle se to prostě chová..
Chamurappi
Profil
Reaguji na _es:
Ale potom predsa nebude formulár odoslaný.
Bude, protože standardní odeslání nestornuje. Jen zobrazí animaci. Prohlížeč zůstane na staré stránce, dokud nepřijme první data z té nové, tudíž by měl normálně animovat…


Reaguji na quatzaela:
Teprve až se data zpracují začne se načítat obsah stránky B.
Stránka B nejspíš má možnost poslat prohlížeči nějaká data i před tím, než v ní začne časově náročné zpracování. Moc PHP neznám, ale čekal bych, že k tomu bude funkce flush.
_es
Profil
Chamurappi:
Prohlížeč zůstane na staré stránce, dokud nepřijme první data z té nové, tudíž by měl normálně animovat…
Môže však len „animovať“ a čakať na tie prvé dáta, kedy sa však celá stránka A aj s jej JS hneď zruší, teda nemôže reagovať na čiastočne načítané dáta, zobrazovať priebeh procesu spracovania a pod.

Stránka B nejspíš má možnost poslat prohlížeči nějaká data i před tím, než v ní začne časově náročné zpracování.
Čo je vlastne rada, aby to „animovanie“, či niečo iné do konca spracovania, robila stránka B, či nie?
Chamurappi
Profil
Reaguji na _es:
teda nemôže reagovať na čiastočne načítané dáta, zobrazovať priebeh procesu spracovania
Nepředpokládal jsem, že chce quatzael něco chytřejšího, než obyčejnou indikaci ve smyslu „něco se děje, nepropadej panice“.

Čo je vlastne rada, aby to ‚animovanie‘, či niečo iné do konca spracovania, robila stránka B, či nie?
Ano, je to také možnost…
quatzael
Profil
Chamurappi:
Zkusil jsem dát na stránku A do události submit zobrazení gif spinner ale vůbec se nezačne točit. Obrázek gif se jen zobrazí, ale nepromítá to další obrázky v sekvenci.
quatzael
Profil
Když tam vložím setTimeout , tak se to sice roztočí, ale pak zase hned přestane jak to začne načítat tu další stránku..
_es
Profil
quatzael:
tak se to sice roztočí, ale pak zase hned přestane jak to začne načítat tu další stránku..
To ti už bolo predsa vysvetlené v [#3] a [#5]. Keď sa začne načítať „stránka B“, tak „stránka A“ zaniká aj so všetkými svojimi objektmi aj bežiacim JS a vzniká nový dokument „stránky B“.
quatzael
Profil
_es:
Jenže tohle není JS spinner, ale GIF. Než se zobrazí stránka B je zobrazena pořád stránka A i s GIFEM, který se ale zastaví a ještě chvíli je zobrazen..
_es
Profil
quatzael:
Jenže tohle není JS spinner, ale GIF.
Je rušená celá zobrazená stránka, aj s obrázkami.

Než se zobrazí stránka B je zobrazena pořád stránka A i s GIFEM, který se ale zastaví a ještě chvíli je zobrazen..
Prehliadač nemusí všetky veci zo stránky zmazať ihneď, nejaké „zbytky“ môžu byť ešte chvíľku zobrazené či nejako čiatočne funkčné. Rôzne prehliadače sa v tomto môžu chovať rôzne.
Chamurappi
Profil
Reaguji na quatzaela:
Než se zobrazí stránka B je zobrazena pořád stránka A i s GIFEM, který se ale zastaví
Tento popis naznačuje, že zdržení způsobuje spíš vykreslování stránky B, než zpracování PHP skriptu. Jinými slovy, že PHP už má hotovo (nebo flushnulo), prohlížeč se už chce se současnou stránkou loučí, ale ta nová ho na chvíli zakousne.

Ale _es má pravdu, že různé prohlížeče se můžou chovat různě… o neochotě některých animovat GIFy, když vědí, že se jde pryč, už jsem tuším slyšel.
quatzael
Profil
Chamurappi:
Zkouším ten doporučenej flush.

Když tam dám přímo ukázku z php.net, tak to okamžitě začne načítat ty lajny:

if (ob_get_level() == 0) ob_start();
for ($i = 0; $i<4; $i++){
        echo "<br> Line to show.";
        echo str_pad('',4096)."\n";    
        ob_flush();
        flush();
        sleep(2);
}
echo "Done.";
ob_end_flush();  

Ale když tam dám svoje řešení, tak script pracuje a po zpracování dat se objeví "Čekejte", samozřejmě potom už jen na chvíli než se stránka načte:

if (ob_get_level() == 0) ob_start();
        echo '<div id="submit-spinner"></div>
        <div id="submit-text">Čekejte</div>';  
        ob_flush();
        flush();
ob_end_clean();  



Aha, musí tam být ten str_pad.. Moc ale nechápu proč.


Další problém je, že ta funkce ob_end_clean() nefunguje a zůstává tam ten obsah i po načtení stránky.


Zkouším to takhle: ob_start(null, 0, PHP_OUTPUT_HANDLER_CLEANABLE ^ PHP_OUTPUT_HANDLER_REMOVABLE); a stejně to nefunguje..
Chamurappi
Profil
Reaguji na quatzaela:
Další problém je, že ta funkce ob_end_clean() nefunguje a zůstává tam ten obsah i po načtení stránky.
Obsah, který jsi už poslal do prohlížeče, nemůžeš nikdy vzít zpět. Takhle HTTP nefunguje.

Zkouším ten doporučenej flush.
Zkoušíš i output buffer (to jsou ty ob_věci), který nejspíš nepotřebuješ. Ten se používá, když chceš dodatečně ještě na serveru přežvýkávat to, co odesíláš, pokud vím. Ovšem o PHP toho moc nevím, tak kdo ví, co vlastně vím a nevím…

Aha, musí tam být ten str_pad.. Moc ale nechápu proč.
Nejspíš proto, aby ten kousek stránky byl vůbec přenositelný. Roli bude hrát asi velikost paketu… nebo něčeho takového. (Je to na mě příliš nízkoúrovňové.)
Keeehi
Profil
Chamurappi:
Nejspíš proto, aby ten kousek stránky byl vůbec přenositelný. Roli bude hrát asi velikost paketu… nebo něčeho takového. (Je to na mě příliš nízkoúrovňové.)
Myslím, že na to má vliv spíše nastavení serveru. Funkce flush sice zajistí, že PHP pošle na výstup data, ty však dostane ještě server (řekněme apache) který má zase svůj vlastní buffer. Řekl bych, že 4kB bude asi defaultní velikost většiny bufferů.
Marschmallow_
Profil *
quatzael:
Skript od Str4wberryho ve tamější [#2] by Ti mohl vyhovovat: Modální okno po kliku na odkaz při načítání stránky.
quatzael
Profil
Chamurappi:
Obsah, který jsi už poslal do prohlížeče, nemůžeš nikdy vzít zpět. Takhle HTTP nefunguje.
Na to jsem už přišel.

Už jsem to celkem vyřešil. Načte se první část stránky pomocí toho flushe, včetně spinneru a překrývajícího polotransparentního backgroundu na pozadí. Jenže zase vyvstal problém, že ten background není roztáhlej přes celou stránku, protože tam mám floating divy a v půlce stránky nejsou ještě uzavřený, tudíž ani nemůžou být vyclearovaný. Vyřešil bych to tak, že bych ve flushi zrušil float a po načtení opět v elementu style zaplnul, ale já ho tam docela potřebuju i při tý půlce stránky, protože mi jinak ostatní obsah skáče někam dolů..

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: