Permalänk
Medlem

AJAX + PHP fråga

Hej!

Undrar lite hur jag kan sköta utskriften som AJAX returnerar när jag använder mig av ett PHP-skript som har en loop.
Har detta:

<script type="text/javascript"> http = new XMLHttpRequest(); function update() { http.open("GET", "skript.php", true); http.onreadystatechange = useHttpResponse; http.send(null); } function useHttpResponse() { if(http.readyState == 4) { var textout = http.responseText; document.getElementById("ajax").innerHTML=textout; } } </script>

PHP-koden är en simpel loop:

for($i = 0; $i < 30000; $i++) { echo 'Hej<br />'; }

Funkar superbra, skriver ut allting när jag klickar på en "Uppdatera"-knapp som kallar på javascript:update(). Problemet är att den skriver inte ut någonting förrän den gjort alla 30.000 loopar och först DÅ skriver den ut.

Hur gör jag så den skriver ut dynamiskt efter varje loop? Vill att texten i #ajax -div:en ska expandera allteftersom. Alltså att det läggs på fler och fler rader i div:en allteftersom PHP-skriptet får köra sin loop.

Permalänk
Medlem
Skrivet av Tanax:

Hej!
(...)
Funkar superbra, skriver ut allting när jag klickar på en "Uppdatera"-knapp som kallar på javascript:update(). Problemet är att den skriver inte ut någonting förrän den gjort alla 30.000 loopar och först DÅ skriver den ut.

Hur gör jag så den skriver ut dynamiskt efter varje loop? Vill att texten i #ajax -div:en ska expandera allteftersom. Alltså att det läggs på fler och fler rader i div:en allteftersom PHP-skriptet får köra sin loop.

Det är inte så det fungerar. Resultatet av skript.php returneras i sin helhet; först när 30,000 iterationer har körts och "sidan" är färdig skickas raderna tillbaka till webbläsaren. Om du vill ha rad för rad så får du göra 30,000 AJAX-requests (vilket inte är en bra lösning). Är det en rent kosmetisk effekt du är ute efter så splitta raderna på klientsidan och lägg till dem i DOM:en styckvis.

Om du istället vill öppna någon sorts realtidskanal mellan webbserver och klientdator så kollar du på fel sak. Googla på 'comet javascript' för mer info.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det är inte så det fungerar. Resultatet av skript.php returneras i sin helhet; först när 30,000 iterationer har körts och "sidan" är färdig skickas raderna tillbaka till webbläsaren. Om du vill ha rad för rad så får du göra 30,000 AJAX-requests (vilket inte är en bra lösning). Är det en rent kosmetisk effekt du är ute efter så splitta raderna på klientsidan och lägg till dem i DOM:en styckvis.

Det är helt och hållet en kosmetisk effekt.
Om du kollar mina tidigare trådar så ser du mitt Facebook-skript. Det är det skriptet jag kommer kalla på. Det tar cirka 8 minuter att köra och jag vill att den skriver ut någonting så att användaren(i nuläget; jag) inte bara ser en blank och ouppdaterad sida utan får feedback när varje vän lagts till.

Detta gick superbra att lösa med hjälp av ob_flush() och flush() när det bara var PHP det handlade om. Nu när jag använder AJAX verkar det tyvärr inte fungera. Hur menar du "splitta raderna" och lägga till dom i DOM:en?

Permalänk
Medlem

Fick det att fungera så som jag ville. Ändrade readyState == 4 till readyState == 3 och körde ob_flush/flush i varje PHP-loop. Fungerar prima!

Permalänk
Medlem
Skrivet av Tanax:

Fick det att fungera så som jag ville. Ändrade readyState == 4 till readyState == 3 och körde ob_flush/flush i varje PHP-loop. Fungerar prima!

Då fick jag lärt mig något nytt då
Fungerar det med alla webbläsare?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Då fick jag lärt mig något nytt då
Fungerar det med alla webbläsare?

Ser inte ut att fungera i IE9. Chrome har jag inte. FireFox är det jag kör med och där fungerar det finfint!

Permalänk
Medlem
Skrivet av Tanax:

Ser inte ut att fungera i IE9. Chrome har jag inte. FireFox är det jag kör med och där fungerar det finfint!

För att det ska fungera med IE så måste du köra detta
var http = new ActiveXObject("Microsoft.XMLHTTP");

Men jag röstar på att du kör med jQuery istället förenklar allt en hel del.

Visa signatur

Utvecklare (Technical Director) / Delägare - Björnmamman

Permalänk
Medlem
Skrivet av Madsoul:

För att det ska fungera med IE så måste du köra detta
var http = new ActiveXObject("Microsoft.XMLHTTP");

Men jag röstar på att du kör med jQuery istället förenklar allt en hel del.

Juste, så var det.
Har tänkt göra det sen men i nuläget behövs det inte då jag utvecklar sidan enbart för privat bruk men tack för tipset!