2016-05-30 11 views
0

Ich kenne Schließungen, IIFE.
Ich habe die anderen Antworten gelesen (sie alle verweisen auf die Verwendung von IIFE).
Warum funktioniert das nicht? https://jsfiddle.net/warkentien2/Lh10phuv/1/
JavaScript: setTimeout nicht aktualisieren Wert innerhalb der Schleife

: allmählich verblassen-in (in 2s)
  • scheint es, wie es nur einmal Rendering (mit Endwert)
  • var imgFade = document.getElementById('img-fade'); 
    for(i = 0; i < 100; i++){ 
        (function(step) { 
        setTimeout(function() { 
         imgFade.style.opacity = (step/100); 
        }, 20); 
        })(i); 
    } 
    

    hier ist der Code

    • mein Bild sollte

      EDIT: für zukünftige Leser
      betrachten alle Antworten von i = 1; to 1 <= 100, i++
      Übergang so wird es nicht

    +2

    Sie Nun, Setzen Sie eine ganze Reihe von Timeouts praktisch gleichzeitig, um sie 20 ms später auszuführen; sie werden alle extrem schnell nacheinander feuern. Sie müssen das Timing ein bisschen verteilen, damit es * graduell * ist. – deceze

    +0

    @deceze das ist nicht das Problem, oder eine einfache extra 0 auf dem setTimeout hätte es behoben. – warkentien2

    +1

    @ warkentien2 Ich denke, es ist das Problem, denn zwischen dem ersten 'setTimeout' und dem letzten gibt es buchstäblich Nanosekunden. Alles, was du sehen wirst, ist also der letzte. 'setInterval' ist wahrscheinlich das, was Sie brauchen. – 4castle

    Antwort

    4

    Eine schnelle, aber schmutzige Art und Weise wird die Multiplikation der 20 von step Rendering bei 99% stoppen. Sie legen alle Timeouts auf einmal, so diejenigen, die später höhere Verzögerung ausgeführt werden sollen:

    var imgFade = document.getElementById('img-fade'); 
    for(i = 0; i < 100; i++){ 
        (function(step) { 
        setTimeout(function() { 
         imgFade.style.opacity = (step/100); 
        }, step * 20); 
        })(i); 
    } 
    
    +0

    Das ist brilliant! Traditionell machen Leute ['setInterval' so] (http://stackoverflow.com/questions/2956966/javascript-telling-setinterval-to-only-fire-x-amount-of-times), aber ich mag das sehr besser. – 4castle

    +0

    also habe ich alle setTimeouts auf einmal erstellt! Ich brauchte eine Weile, um es zu glauben. Ich dachte, es funktioniert wie ein System ("Pause"); Vielen Dank! Und das ist überhaupt kein schmutziger Trick. Vielen Dank! – warkentien2

    +0

    Beachten Sie, dass dadurch die Ausführungswarteschlange mit hundert Callbacks gleichzeitig gesprüht wird.Obwohl es in der Praxis wahrscheinlich kein großes Problem ist, wäre es effizienter, den nächsten Rückruf am Ende des vorherigen zu planen. Es würde Ihnen auch erlauben, die Einblendung zu jeder Zeit abzubrechen, was etwas schwierig wird, wenn die gesamte Sache bereits ausgeführt wird, ohne dass es wirklich möglich ist, hundert Rückrufe abzubrechen. – deceze

    2

    Heres eine andere Lösung, die Fade in einer nach dem anderen Anwendung:

    var fade = function(step){ 
        imgFade.style.opacity = (step/100); 
        if(step < 100){ 
        setTimeout(function(){ fade(++step); }, 20); 
        } 
    }; 
    
    fade(0); 
    
    +0

    schöne Rekursion! Jetzt, wo ich das Problem habe, kann ich mir selbst ein paar Lösungen vorstellen. Aber ich gebe den gebührenden Kredit. – warkentien2

    +0

    Ich denke, eine bessere Version würde '--step' und' if (step> 0) 'verwenden. Auf diese Weise können Sie die Anzahl der Iterationen ändern, indem Sie den Anfangsparameter ändern. – 4castle

    +0

    Süß, froh, dass Sie verstehen, wie es funktioniert! @ 4castle ja, das ist sicher eine Verbesserung – anson