PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JS Funktion in PHP while-Schleife



M3n70s
19.02.2009, 21:21
Ich habe hier eine PHP Funktion, der man Sekunden übergeben kann, und die Funktion macht dann einen Countdown daraus. Ich programmiere selbst nur PHP, und darum kann ich mir selbst nicht mehr weiterhelfen. Hab die Funktion von nem Kumpel, der weiss aber auch nicht weiter.
Funktion:


<script language="JavaScript">
function countdown(sekunden,divid){
s=sekunden;
h=Math.floor(s/3600); s-=h*3600;
m=Math.floor(s/60); s-=m*60;
h=h<10?'0'+h:h; m=m<10?'0'+m:m; s=s<10?'0'+s:s;
document.getElementById(divid).innerHTML=h+':'+m+' :'+s; sekunden--;
if(sekunden>=0){ setTimeout('countdown(s,divid)',1000); }else{document.getElementById(divid).innerHTML= 'Abgelaufen';}
}
</script>
Dann in der PHP while-Schleife hab ich das:

<script type="text/javascript">
countdown('<?=$verbleibende_zeit?>','oase_<?=$id?>');
</script>In der gleichen while-Schleife wird auch noch immer ein passender div-container erzeugt:

<div id="oase_<?=$id?>" align="center"></div>Der Countdown wird nicht angezeigt, und in der Fehlerkonsole bekomm ich für jeden while-Durchlauf folgende Meldung:

Fehler: document.getElementById(divid) is null
Quelldatei: http://kolotool.salzfisch.ch/in/index.php?s=*****
Zeile: 62Nach 2 Stunden suchen und probieren hoffe ich, dass mir hier geholfen wird ;)

DrWhiteLetter
20.02.2009, 13:46
Ich Vermute, dass deine Reihenfolge nicht stimmt. Vermutlich rufst du erst die JS-Funktion auf und erstellst dann erst die DIV-Container.

GregorSamsa
20.02.2009, 13:58
Könnte ne Race-Condition zustande kommen.

Wird erst das Script gestartet, oder erst der DIV-Container geschrieben?

Wichtig ist, dass erst ein DIV-Container im Quelltext steht, und danach das JS gestartet wird.

Also z.B. so:


<script language="JavaScript">
function countdown(sekunden,divid){
s=sekunden;
h=Math.floor(s/3600); s-=h*3600;
m=Math.floor(s/60); s-=m*60;
h=h<10?'0'+h:h; m=m<10?'0'+m:m; s=s<10?'0'+s:s;
document.getElementById(divid).innerHTML=h+':'+m+' :'+s; sekunden--;
if(sekunden>=0){ setTimeout('countdown(s,divid)',1000); }else{document.getElementById(divid).innerHTML= 'Abgelaufen';}
}
</script>

<div id="oase_<?=$id?>" align="center"></div>

<script type="text/javascript">
countdown('<?=$verbleibende_zeit?>','oase_<?=$id?>');
</script>

M3n70s
20.02.2009, 22:24
Habs jetzt hingekriegt. Es hat bei

setTimeout('countdown(s,divid)'
das "s" und "divid" nicht als Variabel erkannt. Musste sie einfach mit "'" und "+" abtrennen ;)

Kann geschlossen werden