mmofacts.com

Countdown Java Sekundeneingabe

gepostet vor 19 Jahre, 5 Monate von Cays
Hallo Leute!

Ich beherrsche zwar PHP, nicht aber Javascript, und genau das brauche ich hier für.
Ich müchte einem script einen Wert geben (timestamp). Jetzt soll dieses Script die Sekunden UND Minuten UND Tage "Countdown mäßig" anzeigen.
Ich denke jeder kann sich vorstellen wie ich das meine.
Wie halt auch in den ganzen anderen Browsergames....

Danke schon einmal.
MfG.Cays
gepostet vor 19 Jahre, 5 Monate von Kallisti
 
function jump2origin() {
parent.game.location.href='foobar.php'; /* bei iframe namesn game, sonst siehe de.selfhtml.org */
}
var rest = new Number();
var rest = 123456;
function countdown() {
if((rest - 1) >= 0)
{
rest = rest - 1;
var min_count = rest/60;
min_count=Math.floor(min_count);
sec_count = rest - (min_count*60);
if(min_count>0)
{
var std_count = min_count/60;
std_count=Math.floor(std_count);
min_count=min_count-std_count*60;
}
else
{
var std_count = 0;
}
if(min_count<10)
{
min_angabe='0'+min_count;
}
else
{
min_angabe=''+min_count;
}
if(sec_count<10)
{
sec_angabe='0'+sec_count;
}
else
{
sec_angabe=''+sec_count;
}
document.anzeige.verbleibend.value = std_count+':'+min_angabe+':'+sec_angabe;
setTimeout('countdown()',986);
}
else
{
document.anzeige.verbleibend.value = 'bitte warten...';
setTimeout('jump2origin()',60000);
}
}
// End -->


Ich habs nicht geschrieben, denn das Problem ist, dass der Timer sich immer mehr verzählt, je nachdem wie lang das Javascript braucht (hier wäre 14 Millisekunden optimal).

Das "schreiben" setzt ein Formular namens "anzeige" und ein Feld namens "verbleibend" voraus. Tage sind nicht dabei, die müsstest du dir selbst schreiben, was ja kein Problem sein sollte.

Ist teils vielleicht nicht elegant, aber es klappt. )
gepostet vor 19 Jahre, 5 Monate von Sogil
Bei mir läuft das folgendermaßen:

 

t1 = new Array();
t2 = new Array();
countdown();


function setText(a, text)
{
document.getElementById(a).innerHTML=text;
}

function Timer(sekunden, spanid)
{
t1[t1.length] = sekunden;
t2[t2.length] = spanid;
}

function countdown()
{
for (i=0; i
{
if (t1[i] > 0)
{
Sek = t1[i]%60;
Min = Math.floor(t1[i] / 60);

if ( t1[i] < 60 )
setText(t2[i], Sek );
else if ( t1[i] < 3600 )
{
Sek =((Sek<10)?"0":"") + (Sek);
Min = Math.floor(t1[i] / 60);
setText(t2[i], Min + ":" + Sek );
}
else
{
Sek =((Sek<10)?"0":"") + (Sek);
Min = Math.floor(t1[i] / 60);
Min%=60;
Min =((Min<10)?"0":"") + (Min);
Stu = Math.floor(t1[i] / 3600);
setText(t2[i], Stu + ":" + Min + ":" + Sek);
}
t1[i]--;
}
else
{
setText(t2[i], "Fertig");
}
}
setTimeout("countdown()", 999);
}
gepostet vor 19 Jahre, 5 Monate von MannaZ
Ich habe auch noch etwas anzubieten - habs aber nicht selber gemacht!
Von einer Ungenauigkeit hab ich noch nichts gemerkt.

 

$restzeit = 6; # Zeit in Sec, die nach unten gezählt werden soll
?>

v=new Date();
var bx=document.getElementById('stimer');
function t(){
n=new Date();
s=-Math.round((n.getTime()-v.getTime())/1000.);
m=0;
h=0;
if(s<0){
bx.innerHTML="Fertig";
} else{
if(s>59){
m=Math.floor(s/60);
s=s-m*60;
}
if(m>59){
h=Math.floor(m/60);
m=m-h*60;
}
if(s<10){
s="0"+s;
}
if(m<10){
m="0"+m;
}
if(h<10){
h="0"+h;
}
bx.innerHTML=h+":"+m+":"+s;
}
window.setTimeout("t();",200);
}
window.onload=t;

gepostet vor 19 Jahre, 5 Monate von BLUESCREEN
Es bringt doch nichts, dass ihr jetzt alle Scripts postet, die genau das gleiche machen (eins hätte gereicht):

Einen Timeout setzen und die Restzeit runterzählen, sobald dieser erreicht ist.

Dabei werden eben die Ausführungszeit sowie Verzögerungen beim Einhalten dieses Timeouts nicht berücksichtigt wodurch es je nach Client früher oder später zu Zeitdifferenzen kommt.

Bsp.: Wenn die Funktion alle 1000ms aufgerufen wird, es aber immer zu 10ms Verzögerungen kommt, dann hat der Countdown nach 100 Sekunden eine Differenz zur realen Zeit von einer Sekunde. Dies kann man nicht beheben, da die Verzögerung von Client zu Client unterschiedlich ist und aufgrund der Systemlast schwanken kann.

Ein korrektes Script müsste über die Systemzeit die Restzeit des Countdowns jede Sekunde neu berechnen.
gepostet vor 19 Jahre, 5 Monate von Gambler
Dann muss man aber auch auf die Differenz zwischen Server und Clientzeit achten.
gepostet vor 19 Jahre, 5 Monate von HSINC
die muss man logischerwweise mit reinrechnen, man kann die serverzeit ja dyn in das js schreiben. zwar gibt es da noch ein paar sec verzögerung durch das laden der seite, aber das kann man auch mittels js am anfang und ende des ladens kompensieren. und dann halt normal via timeout aller sec guggen was sich verändert
ist alles kein problem ^^
gepostet vor 19 Jahre, 5 Monate von Cays
So, danke für die Skripte!
Werde mal sehen welches ich nehmen werde.... Sehen alle recht gut aus!
MfG.Cays
gepostet vor 19 Jahre, 5 Monate von Kallisti
Nimm Mannaz' Grundkonzept mit gettime und bau noch die potentielle Zeitdifferenz zum Server ein, das sollte dann die eleganteste Variante sein.

BLUESCREEN: Daher sagte ich ja, dass ich es nicht geschrieben hab, aber unterschiede gibts schon in den Sources und der unterste berücksichtigt ja zumindest die Clientzeit (wobei nen 200ms timeout imho unnötig gering ist).
gepostet vor 19 Jahre, 4 Monate von Drezil
Ich wollte mein Countdown gad noch posten, weil ich deke der differenziert sich in einem kleinen teil:

zuerst einmal das java-script (im grafik-pack beim client)
 



erstmal die "nebenfuktionen":
str sectodhmsstr() (-> sec to d h:m:s (str)): Wandelt sekunden in einen string um: format (X Tage; wenn X > 0) HH:MM:SS
bool lz(x): prüft, ob ne 0 vorangestellt werden muss -> ausgabe bool
void counter(Wieviele Sekunden, Startzeit, Counter-id (s. php-teil)): schaltet die umwandlung der zeit in text bzw. blendet ein "wird fertiggestelt" ein. triggert sich selbst nach 500 ms
void all_timer(): Hauptfunktion. sucht im gesamten Quellcode nach -Tags und liest den HTML-Part ein. Wandelt den dann in sec und triggert die funktion counter die die ausgabe regelt.

nun zum PHP-Teil:
 

function sectodhmsstr($sec) {
if ($sec < 0) return "Wird fertiggestellt";
$str = $sec % 60;
$sec -= ($sec % 60);
$sec /= 60;
$str = ($sec % 60).":".$str;
$sec -= ($sec % 60);
$sec /= 60;
$str = ($sec % 24).":".$str;
$sec -= ($sec % 24);
$sec /= 24;
$sec = floor($sec); // falls $sec kein int war
return $sec > 0 ? $sec." Tag". (($sec > 1) ? "e" : "") ."
".$str : $str;
}
/* weitere funktionen */
counterindex = 0;
/* your code here */
//ausgabe: link zum java-script
//ausgabe: im body-tag ein onload="all_timer()"
/* beispielausgabe */
echo 'Restzeit: '.sectodhmsstr(86410).'';
/* more code here */
echo 'Noch ne zeit: '.sectodhmsstr(10).'';
/* noch mehr code */
?>

Zur erklärung: die sectodhmsstr gibt nen string in einem bestimmten format aus (X Tag(e) xxxx). Dieses Format liest das javascript nachher wieder ein.
der counterindex wird erst auf 0 gesetzt. so gibt sich bei der ersten ausgabe die id "count0". dur das ++ wird der index nach der ausgabe automatisch inkrementiert.
so schaltet man mit nur einer codezeile nen neuen counter, ohne gleich direkt auf java-script zugreifen zu müssen.

Vorteile:
- einfach möglich X counter zu realisieren
- kein javascript (außer das onload im body-tag) bei der ausgabe nötig. auch keine anpassung.
- nutzer die javascript abgeschaltet haben/nicht unterstützen erhalten dennoch eine Darstellung (ebenso blinde, die sich den text ausgeben lassen müssen)

hth
gepostet vor 19 Jahre, 4 Monate von Crasher
sry aber ich hab jetzt doch noch ne frage:

wie kann ich die mit CSS versehen ich habs jetzt über ne externe datei versucht und über style aber das geht alles nicht.

Crasher

Auf diese Diskussion antworten