Timerfunktion beenden und neu starten

MadDog81

Grünschnabel
Grüetzi wohl.

Ich doktore nun seit geraumer Zeit an einem kleinen Problem rum und brauche mal neuen Input bzw die expertise eines anderen.

Ich habe eine Seite auf der ich ein gewöhnliches Timerscript (setTimeout) starte welches einen Wert hoch zählt.
Der Wert kommt aus meiner Datenbank.

Das Script selber läuft einwandfrei und macht das was es soll.

Mit einem Klick auf einem Button verändere ich den Wert in der Datenbank und lade das Div per jquery neu.
Das Script holt sich nun die neuen Datenbankwerte und startet den Timer.

Mein Problem ist , das wenn ich neu lade zwei gleichzeitig laufende Scripte haben welche gleichzeitig ihre Wert in mein Ausgabe Div posten und sich böse überlagern.
Einmal den alten Wert und einmal den neuen veränderten Wert.

Ich habe nun versucht das Script zu unterbrechen mit der clearTimeout function, und mit einem Boolschenschalter (true/false) welche ich vor dem .load ausführe/betätige.
clearTimeout funktioniert gar nicht in Verbindung mit dem .load des Divs,
Die Boolsche Variabel schaltet zwar den Timer aus, das Problem ist allerdings wenn ich das Script neu initialisiere (also die Boolsche Variabel wieder auf true setze dann startet der Timer nicht nur mit dem neuen Wert sondern auch mit dem alten. Das Problem ist also das selbe.

Meine Frage nach einem Lösungsansatz wäre nun wie ich den Timer unterbrechen kann, so das er bei einer Neuinitialisierung nicht wieder mit dem alten Wert startet.

MfG
MadDog
 
Hallo MadDog!

clearTimeout/clearInterval ist der schon richtige Weg. Ich vermute, dass du diese Funktionen in Kombinationen mit dem AJAX-Ladevorgang nicht in die richtigen Reihenfolge gesetzt hast.
Zeig doch bitte deinen Code :)
 
Ich habe nun versucht das Script zu unterbrechen mit der clearTimeout function, und mit einem Boolschenschalter (true/false) welche ich vor dem .load ausführe/betätige.
Auf jeden Fall die Stellen mit setTimeout, clearTimeout, deiner boolschen Variable und dem .load, in dem du wieder setTimeout aufrufst.
 
Zeig doch bitte deinen Code
Ich kann mich da nur anschließen. Du solltest zumindest deinen Javascript Code zeigen, ansonsten spielen wir bloß solange Topfschlagen bis wir irgendwann den richtigen Topf getroffen haben.

Wir schauen uns auch gerne längere Codes an, die Antwort kann dann ein wenig länger dauern aber immerhin bekommst du überhaupt eine.
 
ich habe eine hauptseite, durch einen .click lade ich ein div nach.

Dort wird im nachgeladenen div folgendes initialisiert (aus der im Headbereich geladenen .js) :
Javascript:
var Zuwachsschalter;
function Zuwachs (mstime,Menge,Zuwachs,id){
if (Zuwachsschalter){
if (mstime === 0){var mstime=new Date();var mstime=mstime.getTime();}
var mstime2=new Date();
var mstime2=mstime2.getTime();
var ms=mstime2-mstime;
var s=ms/1000;
var zuwachs2=s*Zuwachs;
var Menge2=zuwachs2+Menge;
var Menge2round=Math.round(Menge2);
var Menge2format=number_format(Menge2round, 0, ",", ".");
document.getElementById(id).innerHTML=Menge2format;
Zuwachstimeout=window.setTimeout("Zuwachs("+mstime+","+Menge+","+Zuwachs+",\""+id+"\")",1000);}}

nach etlichen Zeile Code gibt es innerhalb einer Javascript function die möglichkeit auf eine grafische Fläche zu klicken und folgendes auszulösen :

Javascript:
Overlay.click(function()
       {
           // Zuwachsschalter=false;
           // bzw
          // window.clearTimeout(Zuwachstimeout);
           $("#Anzeige").load
           (
               "a.php",
               {
                   // übergabe von variabeln an den seiten anfang
                   // dort werden die POST vars im PHP verarbeitet bis sie wieder an den Timer übergeben werden 
               }
           );


Das Prinzip ist das durch den Click das div neu geladen werden soll und durch die Übergabe von Post-Werten die Daten für den Timer verändert werden.

Die Funktion als solches macht genau das was sie soll.

Das Problem ist wie gesagt das ich zwei Ausgaben in dem Ausgabe div habe die sich überlagern.

Ich habe den selben Timer auch auf einem Hover liegen. Dort stellt sich der Timer an wenn der Hover aktiviert ist (Bool=true+Aufruf der Funktion) und stellt sich ab sobald Hover out ist durch Bool=false.
Das klappt wunderbar und mit diesem Prinzip habe ich in diesem Kontext das Überlagerungsproblem lösen können.

Was ich nun bei der .load Funktion versucht habe mt der boolschen ist im Grunde das selbe. Ich stelle die Bool aus und lade das Div mit dem Timer neu. Beim Aufruf des Timers in HTML (init<script></script>) stelle ich die Bool wieder auf True.
Und bekomme eine doppelte Ausgabe.

Dann habe ich das ganze mit clearTimeout versucht was genauso wenig klappt. Der Timer postet doppelt.

Das nächste was ich versucht habe war eine doppelte load funktion.
click.load mit der Bool auf false, durchlaufen des codes bis nach dem Aufruf des Timerscriptes welches dann auch ohne Probleme nicht initialisiert worden ist und dort eine Abfrage eingebaut :
if bool=false -> .load -> bool=true

Was ebenfalls dazu geführt hat das ich nachdem wiederholten laden einen Doppelpost bekommen habe.

Ebenso habe ich versucht den Timerscript wie auch die .load funktion an anderen stellen des scriptes zu positionieren was auch zu keinem anderen Resultat führte...
 
Zuletzt bearbeitet:
Zuwachstimeout=window.setTimeout("Zuwachs("+mstime+","+Menge+","+Zuwachs+",\""+id+"\")",1000);}}
Man sollte an setTimeout keine Strings übergeben, denn einerseits kann das Performanz-Implikationen haben (ähnlich eval) und andererseits ist das eigenständige Bauen von Code auch fehleranfällig.
Javascript:
// Auch mit Fat Arrow Function möglich
Zuwachstimeout = window.setTimeout(function () {
  Zuwachs(mstime, Menge, Zuwachs, id);
}, 1000);

Verstehe ich das richtig, dass du in das DIV dynamisch einen <script> Block lädst, der den zweiten Timer dann aktiviert?
 
Sind in dem Sinne ja keine Strings, sondern schon Zahlenwerte bis auf die ID.

Ich starte die Timer-Funktion erst durch den Aufruf im dementsprechenden Div per init <script></script> wenn ich ihn brauche.
 
Gut.
Ich denke mal das es daran liegt das ich den Timer ein zweites mal dynamisch nachlade.
Ich hab es nun mit einem PHP-Umweg gelöst.
Ich danke für die mühen.
Wenn jemand noch eine Idee hat wäre ich trotzdem sehr dankbar.
 

Neue Beiträge

Zurück