Hi jo,
ich kämpfe seit 2 Tagen gegen setInterval und setTimeout und verstehe diese Scope Sache nicht.
Situation: Eine Seite wird dynamisch per Ajax geladen. Der Teil enthält neben html auch Javascript das ebenfalls dynamisch geladen und ab diesem Zeitpunkt aktiv wird.
Gedanke: Wenn die Seite nochmals per Ajax neu befüllt wird, oder auch geleert wird....verschwindet ja auch das darin aktive Script. Ich bin davon aus das ein gelöschtes Script auch nicht mehr läuft weils ja weg ist. aber die timer laufen weiterhin
hat das mit dem window scope zu tun das timer nicht temporär sondern global im Browser sitzen?
Ziel: der dynamisch nachgeladene Inhalt beinhaltet neben html und JS einen Ladebalken der per Intervall akualisiert wird. Damit mehrere Timer Intervalle möglich werden hatte ich schon versucht den Timer an das Element zu knüpfen, damit wenn das element tot ist auch der timer tot ist. Wilde Theorie.
Hatte auch überlegt globale Variablen bzw. ein Array als Timer Sammelliste zu machen, die man beim neuladen der Inhalten dann komplett löscht. Ich bekomm die Timerinstanz nicht kontrolliert das ist das Problem. Hatt gehofft die Instanz wäre realativ innerhalb der Funktion und stirbt wenn die Funktion tot ist.
Derzeit bin ich auf setTimeout übergegangen weil das besser sein soll.
Bei jedem dynamischen neuladen werden aber die timer der davorgeladenen mit übernommen bzw. existieren weiter. Muss ich die einzelnen Instanzen einfach nur stoppen wenn die Seite neu geladen wird ? Aber wenn mein Element den Timer bekommt "elm.timer =" und das element existiert nicht mehr, ist die Referenz Var (mit dem timer) dann nicht ungültig? Wohin ist dann dieser Timer.
Ich lese bei stackoverflow immer was komplexes von wegen Outer Scope und anonyme Funktionen oder auch window.settimeout bla bla. Es scheint wohl kompliziert zu sein.
ich kämpfe seit 2 Tagen gegen setInterval und setTimeout und verstehe diese Scope Sache nicht.
Situation: Eine Seite wird dynamisch per Ajax geladen. Der Teil enthält neben html auch Javascript das ebenfalls dynamisch geladen und ab diesem Zeitpunkt aktiv wird.
Gedanke: Wenn die Seite nochmals per Ajax neu befüllt wird, oder auch geleert wird....verschwindet ja auch das darin aktive Script. Ich bin davon aus das ein gelöschtes Script auch nicht mehr läuft weils ja weg ist. aber die timer laufen weiterhin

Ziel: der dynamisch nachgeladene Inhalt beinhaltet neben html und JS einen Ladebalken der per Intervall akualisiert wird. Damit mehrere Timer Intervalle möglich werden hatte ich schon versucht den Timer an das Element zu knüpfen, damit wenn das element tot ist auch der timer tot ist. Wilde Theorie.
Hatte auch überlegt globale Variablen bzw. ein Array als Timer Sammelliste zu machen, die man beim neuladen der Inhalten dann komplett löscht. Ich bekomm die Timerinstanz nicht kontrolliert das ist das Problem. Hatt gehofft die Instanz wäre realativ innerhalb der Funktion und stirbt wenn die Funktion tot ist.

Derzeit bin ich auf setTimeout übergegangen weil das besser sein soll.
Bei jedem dynamischen neuladen werden aber die timer der davorgeladenen mit übernommen bzw. existieren weiter. Muss ich die einzelnen Instanzen einfach nur stoppen wenn die Seite neu geladen wird ? Aber wenn mein Element den Timer bekommt "elm.timer =" und das element existiert nicht mehr, ist die Referenz Var (mit dem timer) dann nicht ungültig? Wohin ist dann dieser Timer.
Ich lese bei stackoverflow immer was komplexes von wegen Outer Scope und anonyme Funktionen oder auch window.settimeout bla bla. Es scheint wohl kompliziert zu sein.
PHP-Code:
var allelements2 = document.getElementsByClassName("standardloader");
$.each( allelements2, function( i, elm ){// alle Loaders Starten
if($(elm).attr("alt") != ""){
var labelEl = $(".ui-label", elm),
valueEl = $(".value", labelEl);
var fertig = parseInt($(valueEl).text());//fertige Prozentzahl importieren
$(elm).data("fertig", fertig);//Prozentzahl in Element speichern
if(fertig <= 99){var interval = parseInt($(elm).attr("alt"))*1000;//berechnet aus Restzeit und Prozentsatz
//$(elm).animateProgress(fertig,elm, interval);//nur einmal animieren
var looping = setTimeout(function(){ $(elm).animateProgress(fertig,looping, interval) }, interval);//dauercheck starten und animieren
}
}
});
PHP-Code:
$.fn.animateProgress = function(progress, elm, interval) {
return this.each(function() {
if(progress <= 99){
var next2 = progress;
progress += 1;
//$(this).data("fertig") + 1;//ein Prozent weiter
if(elm && interval >= 0){
elm.timer = setTimeout(function(){$(elm).animateProgress(progress, elm, interval)}, interval);
}
Kommentar