Archivlink: javarea.de Forum > JavaScript > JS-Code von single auf multi stellen
Vollständigen Link anzeigen: javarea.de Forum > JavaScript > JS-Code von single auf multi stellen

Pages: [1] 2 ... nächste » ... Letzte »

geschrieben von the_weird am 16.01.2006 - 14:10
Hallo,
ich habe mal wieder ein Problem mit javascript. Ich habe diesen Code diesmal sogar selber geschrieben ;) Es ist ein Timer, jedoch habe ich das Problem, wenn ich den Code mit mehren sachen auf einmal anspreche dann ist der Timer nicht mehr richtig. (z.B. Wenn ich mit 3 gleichzeitig drauf zugreife, dann zählt der je tick 3 Sekundn runter, wenn es 5 zugriffe sind dann sind es 5 Sekunden pro tick.

Was muss ich an dem Code ändern, damit er bei jedem Tick trotzdem nur 1 Sekunde macht?

Danke euch im Voraus.

HTML-Quelltext
1: 
2: 
3: 
4: 
var minuten = 2;
var sekunden = 10; 
var divlayer = 1;
timer();

HTML-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
<script>
function timer()
{
	if(sekunden>0)
	{
		if(sekunden <= 9)
			document.getElementById(divlayer).innerHTML = minuten + ':0' + sekunden;
		else
			document.getElementById(divlayer).innerHTML = minuten + ':' + sekunden;
		sekunden = sekunden - 1;
		setTimeout("timer()", 1000)
	} 
	
	else if(sekunden == 0 && minuten != 0) 
	{
		minuten--;
		sekunden = 59;
		document.getElementById(divlayer).innerHTML = minuten + ':' + sekunden;
		timer();
	}
	
	else
		document.getElementById(divlayer).innerHTML = 'Fertig';
}
</script>

geschrieben von okley am 16.01.2006 - 15:23
ich würde mal versuchen den aufruf von setTimout("timer()", 1000); nur einmal zu machen.
Weil:
Wenn du dieses setTimout z.B. fünfmal nacheinandern aufrufst (bzw. 5mal auf timer() zugreifst), dann setzt der jedes mal eine neue 'Timout Instanz'. Wenn also die erste Instanz nach der ersten Sekunden wieder aufgerufen wird, ist deine globale Variable sekunden von den fünf Aufrufen zu beginn heruntergesetzt worden. Verstehst du was ich meine?

geschrieben von Martin am 16.01.2006 - 15:29
Ave,

du hast nur ein globale Variable sekunde.

Wenn du 5 Funktionen time() startest, vermindert jede Funktion die Variable sekunde um 1. Also wird die Variable insgesamt um 5 verringert.

mfg martin

geschrieben von the_weird am 16.01.2006 - 18:14
so sieht es Momentan bei mir aus. ich kenne mich zwar gut mit php aus, aber js ist neuland für mich ;) Deswegen habe ich oben geschreiben, dass dieser Code mal von mir selber geschrieben wurde *fgg*.

Der Fehler den ich da gemacht habe, ist mir inzwischen klar. Allerdings weis ich nicht, wie ich diesen auch beheben kann

//EDIT
das Problem ist, dass der Timer von mehreren Stellen mit verschiedenen anfangszahlen gestartet werden soll. Einmal mit 8 Minuten, einmal mit 2, ...

geschrieben von Micha am 16.01.2006 - 18:59
Hallo

füge außerhalb Deiner Funktion eine (globale) Variable ein, die dafür sorgt, dass das setTimout nur einmal aufgerufen wird...

HTML-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
10: 
11: 
12: 
13: 
<script...>
var stop = true;
function timer()
..
..
if (stop){
  setTimeout("timer()", 1000)
  stop = false;
}
..
..
}
</script>

So zB
Micha

geschrieben von the_weird am 16.01.2006 - 19:31
also wenn ich das richtig aus c-Sharp kenne ist das setTimeout nicht anderes als auch das Threading.Thread.Sleep(); und wenn ich dem jetzt sage, der soll das nur 1 mal aufrufen, dann wird das script genau 1 Sekunde herunterzählen, und mehr nicht mehr.
Und ich will ja schon, dass das Script normal einen countdown macht, allerdings ich das script als funktion auch von mehreren stellen gleichzeitig ansteuern kann.

Weil selbst wenn ich das einbaue, was derletztekick schrieb, dann zählt er jetzt auch nur bei dem letzten um 1 Sekunde herunter und nicht bei allen 5

geschrieben von Micha am 16.01.2006 - 19:46
Mal eine Frage, wie "greifst" Du drauf zu?

geschrieben von the_weird am 16.01.2006 - 22:34
mit
HTML-Quelltext
1: 
2: 
3: 
4: 
5: 
6: 
<script>
var minuten = 2;
var sekunden = 10; 
var divlayer = 1;
timer();
</script>

geschrieben von Micha am 16.01.2006 - 23:26
Hallo

Ja, okay das ist mir schon klar. Was verstehst Du unter: "wenn es 5 zugriffe sind dann sind". Sind damit die Zugriffe von Personen gemeint; also 5 unterschiedliche Leute, die sich auf Deiner Seite befinden?

Micha

geschrieben von the_weird am 16.01.2006 - 23:38
nein, es werden auf der Seite 5 Countdowns geladen, oder manchmal auch mehr von einem User.

Fertigstellung ins : xx:xx
Fertigstellung ins : xx:xx
Fertigstellung ins : xx:xx
Fertigstellung ins : xx:xx
Fertigstellung ins : xx:xx
Fertigstellung ins : xx:xx
Fertigstellung ins : xx:xx
...

geschrieben von Micha am 17.01.2006 - 00:37

geschrieben von the_weird am 17.01.2006 - 02:16
super, danke für den Code aber ich habe mir das mal angeschaut, ist es möglich den code dynamisch erweiterbar zu machen auf 20 oder 40?
Denn die Einträge werden aus einer MySQL - Datenbank ausgelesen und werden dann per php an eine tpl weitergegeben. Im tpl wird dann in einer Schleife das js aufgerufen.

danke dir schonmal im voraus für die mühe

geschrieben von Martin am 17.01.2006 - 08:55
Ave

wenn du im JavaScript Bereich per PHP/TPL eine neue Zeile countdowns[xx] = new Array(null,null,false); einfügst hast du einen weiteren Counter.

mfg martin

geschrieben von Micha am 17.01.2006 - 09:38
Hi

Wie Martin schon schrieb ist das wohl die einfachste Lösung. In dem Moment, in dem Du die Daten ausließt fügst Du gleich ein neues Array-Element mit ran.

Es _müsste_ auch gehen, wenn Du Dir ein eigenes Objekt schaffst. Die Eigenschaften dieses Objektes sind: Minuten, Sekunden, Starte ggf. das DIV. Bei jedem Klick fügst Du einer Liste eine neues Objekt an. Danach dann der Algorithmus mit dem Suchen.

Wie gesagt _müsste_ ich habe in JavaScript noch nie OO-Programmiert und versuche gerade mal in Java ein wenig Fuß zufassen.

Viele Wege führen nach Rom und der gezeigte Quellcode ist sicher noch optimierungsfähig - sei kreativ!

Micha

geschrieben von the_weird am 21.01.2006 - 12:43


Powered by: JBB v.2.0.4 Copyright ©2000-2006, www.javarea.de.