[php] img pas zichtbaar na doorlopen lus

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik ben bezig een feedback venster te maken. Dit bestaat uit een gifje en een divje dat ik in een loopje update dmv javaScript. alleen krijg ik nu pas mijn plaatje te zien nadat de loop geheel doorlopen is.
wie weet hoe dit komt (en hoe ik het kan omzeilen)?
PHP:
4
5
6
7
8
9
10
11
12
13
14
15
16
17
print ("[img]'images/vast.gif'[/img]");
flush();

print ("bezig");
print ("<div id='divje'></div>");

    for ($dummyVar=0; $dummyVar<850; $dummyVar++) {

        print ("<script language='javaScript'>");
        print ("    document.getElementById('divje').innerText = '".$dummyVar."';");
        print ("</script>");
        flush();

}

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Je loopje is niet de bottle neck, maar de verbinding. Ookal heb je die flush erbij staan, het toevoegen aan de output buffer gaat zo sneller dan dat je eigen computer het weer ingelezen en verwerkt heeft. Waarschijnlijk krijg je een beter effect waneer je een pauze van een seconde oid in je loop opneemt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ook met een pauze erin krijg ik het plaatje pas te zien na dat de loop klaar is...
PHP:
4
5
6
7
8
9
10
11
12
13
14
for ($dummyVar=0; $dummyVar<5; $dummyVar++) {
    $delay = 2;
    $starttime = time();
    while (time() < ($starttime + $delay)) {
        //wacht
    }
    print ("<script language='javaScript'>");
    print ("    document.getElementById('divje').innerText = '".$dummyVar."';");
    print ("</script>");
    flush();
}

en het verhaal over de output buffer begrijp ik niet helemaal: mijn img staat toch eerst in de gegenereerde code, en zou dan toch eerst moeten worden behandeld door de browser?

Acties:
  • 0 Henk 'm!

  • Bas Jansen
  • Registratie: Juni 2000
  • Laatst online: 13-06 09:15
Is de source die je geeft de volledige pagina of niet? Browsers wachten ook nog wel eens tot de eerste (paar?) kb binnen is voordat er iets op het scherm gezet wordt.

edit: bovendien kun je dit ook allemaal in JavaScript oplossen dmv een simpel scriptje!

[ Voor 22% gewijzigd door Bas Jansen op 02-05-2003 12:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dit is een volledige pagina (afgezien van html/head/body etc) die het probleem illustreert. in de uiteindelijke pagina komt wel nog een hele lap php code in het loopje.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Ik vind 850 javascriptje wegschrijven om een soort teller-effect te krijgen nu niet echt efficient. Ik weet niet wat je wilt bereiken, maar ik weet zeker dat er betere oplossingen zijn...

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik wil in een popup de voortgang weergeven van bv bewerkingen op een database. ik wil een animated gifje tonen en de voortgang. in eerste instantie had ik de waardes in een formulier gezet dat ik steeds naar zichzelf liet submitten, maar volgens mij begint dan steeds je gifje opnieuw. een alternatief is een frameset met in 1frame de voortgang en in 1 frame het gifje, maar dan heb ik dus 3 bestanden nodig, terwijl het volgens mij in principe zo moet kunnen...

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:21

crisp

Devver

Pixelated

Het mooist naar mijn mening is om de voortgangcheck los te koppelen van de verwerking zelf. Laat bijvoorbeeld je verwerkingscript de status naar een bestandje (bijvoorbeeld XML) wegschrijven op de server, en laat je popup met javascript httpXML requests dat bestandje om de zoveel seconden uitlezen en weergeven.

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
als ik xml kende zou ik het zo proberen :) . Maar ik zou het naar een textfiletje kunnen schrijven en met flash uitlezen (txt filetjes kun je volgens mij niet dmv javascript inlezen?)...

maar er kleven toch op zich geen echte bezwaren aan het sturen van javascriptjes? je zou dat evt ook kunnen beperken tot een update om de zoveel wijzigingen, zodat je uiteindelijk maar een stuk of 10x een commando stuurt

Acties:
  • 0 Henk 'm!

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 16:46

RM-rf

1 2 3 4 5 7 6 8 9

als het simpelweg gaat om het tellen tot 850, is het werken met php nogal onzinnig; dat kan je beter doen met javascript zelf, alles direct clientside,
dan door het renderen van 850x een zichzelf herhalend stukje code.

wil je dynamisch zaken inladen via javascript kun je werken met zowel iets als het wegschrijven van script-tags die extern javascript-sources inlezen
JavaScript:
1
2
3
4
5
6
7
8
var loadVar
function dynamicLoader() {
   if (!loadVar) {
        document.write('<script type="text/javascript" src="script.php"></'+'script>')
   } else
   clearInterval(loadInt)
}
var loadInt = setInterval("dynamicLoader()", 100)


het php script checkt de db-voortgang en retourneert gewoon een leeg file-tje met header("content-type: text/javascript;") zodra deze nog niet klaar is;
zodra hij klaar is retourneert hij:
JavaScript:
1
var loadVar=true


wil je gewoon een teller tot 850 kun je domweg
code:
1
2
3
4
5
6
7
var i=0
function tellertje() {
   document.getElementById('blah').innerHTML = i
   i++
   if (i<850) setTimeout("tellertje()", 100) 
}
tellertje()

je php script kan dan gewoon de content, het beste lijkt me dan om het php-script te laten afsluiten en nadat het javascript is uitgeteld een nieuw request te plaatsen: een location.replace() of eventueel een createElement("IFRAME")

[ Voor 25% gewijzigd door RM-rf op 02-05-2003 15:00 ]

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Acties:
  • 0 Henk 'm!

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01 11:31
IE begint pas de pagina op te bouwen na de eerst zoveel bytes.

echo str_repeat( ' ', 300 ); bovenaan je pagina fixed dit wel..

Tis een 'quick hack (tm)', maar het werkt wel. Misschien is het toch verstandig eens te kijken naar de andere oplossingen die hier geboden worden.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ook met deze quick hack wacht het plaatje tot het loopje voorbij is :( en het tellertje dat er in staat zie je wel updaten, dus de pagina wordt wel al door IE opgebouwd.

ben de bijdrage van RM-rf nog even om me in aan het laten werken

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RM-rf: als ik je goed begrijp bedoel je dit (pseudo-code):
code:
1
2
3
4
5
6
7
8
9
print <img>;

print code js loadertje;

begin loop {
    doe je db acties
    update src bestand voor js loadertje
}
laat js loadertje stoppen

volgens mij wacht de browser dan nog steeds met het tonen van het plaatje totdat de loop voorbij is.

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Zeker weten doe ik het niet, maar volgens mij is het probleem dat je browser niet weet waar die het plaatje moet plaatsen TOTDAT de hele body geladen is. Als je het plaatje evt al een positie en grootte geeft bijv:
code:
1
[img]"plaatje.jpg"[/img]

Zou het nog wel eens kunnen werken....

Acties:
  • 0 Henk 'm!

Verwijderd

Draai je apache + php op een windows server? Als dat zo is dan gaat het niet werken (volgens php.net) (8>

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
beetle71: nu reserveert de browser wel ruimte voor mijn plaatje, maar laat m helaas nog steeds niet zien.

Fino69: ik draai apache onder linux. ben wel benieuwd wat er onder windows precies niet gaat werken volgens php.net, en waar je het precies hebt gevonden. ik heb zelf op php.net niets kunnen vinden dat met mijn probleem te maken had. mocht je de url nog ergens hebben... O-)

ik heb nu maar geprobeerd het dmv van een frameset op te lossen: plaatje in bovenste frame, loopje in onderste. maar ook dan is het plaatje pas te zien nadat de loop in het andere frame is afgerond. een tekst in het plaatjesframe wordt wel direct getoond :?
ook het wisselen van boven en onderframe (ik hoopt dat dat nog uit zou maken welke het eerst verwerkt werd) maakt niets uit.
Pagina: 1