2016-08-19 1 views
0

Ich versuche, ein Array mit Index i durchlaufen. Was es derzeit erhöht i alle 5 Sekunden.Neustart setInterval Timer nach Tastendruck

Allerdings möchte ich hinzufügen, in der Option i manuell inkrementieren, die den Timer zurück auf 5 Sekunden (5000) zurückgesetzt werden sollte. Wie erreiche ich das erfolgreich?

So zum Beispiel

[a, b, c, d, e, f, g] 

Am Anfang sollte es „a“ (oder was auch immer Funktion, die ich später wählen) anzuzeigen, 5 Sekunden warten, Anzeige „b“ Wenn ich die rechte Pfeiltaste drücken dann sollte es sofort zu "c" wechseln, aber dann noch 5 Sekunden warten bis ich wieder -> drücke.

Ich habe versucht, das Inkrement in eine separate Funktion zu setzen, aber das hat nicht so gut funktioniert.

function doThis() { 
if (i < (l + 1)) { 
         $('#myDiv').html(myArray[i]); 

         i++; 
         if (i == (l + 1)) { 
          doNext(); 
         } 
        }} 

        var intervalHandle = setInterval(doThis, 5000); // start the interval by default 
        var running = true; // true if the interval is running, false if its not. 




          $("body").keydown(function (e) { 
           if (e.keyCode == 39) {//right 

            console.log("testing"); 
            if (running) { 
             clearInterval(intervalHandle); // stop interval 
             running = false; // mark interval as stopped 
            } else { 
             intervalHandle = setInterval(doThis, 5000); // start interval 
             running = true; // mark interval as started 
             doThis(); // also change the image right now 
            } 


           } else { 
            e.preventDefault(); 
           } 

          }); 

function doNext(){ 
//something here, when i ==l+1 as noted above 
} 
+0

Vorschlag: Wenn der Benutzer etwas anzeigen möchte, stoppen Sie den Timer vollständig. Sie können langsam lesen und benötigen mehr als fünf Sekunden, und sie haben offensichtlich gezeigt, dass sie wissen, wie man sie manuell steuert. – zzzzBov

Antwort

1

Eine mögliche Lösung ist die Arbeit in einem Verschluss zu wickeln, wo eher direkten Aufruf setInterval Sie eine Funktion aufrufen, die setInterval anrufen und dann eine Funktion zurück, die verwendet werden können, um das Intervall zurückgesetzt und das übergebene erhöhen in Wert.

function startInterval(i) { 
    var interval = setInterval(function() { 
    i++ 
    }, 5000); 

    return function() { 
    clearInterval(interval) 
    i++; 
    interval = setInterval(function() { 
    i++ 
    }, 5000); 
    } 
} 

var i = 0; 
var manualIncrement = startInterval(i); 

$('body').keydown(function(e) { 
    if(e.keyCode === 39) { 
    manualIncrement(); 
    } else { 
    e.preventDefault(); 
    } 
}) 
+0

Danke @mkalish für die Hilfe! Ich bin immer noch ein wenig verwirrt. Wo würde manualIncrement ins Spiel kommen? –

+0

@turner Ich habe das Beispiel aktualisiert, um anzuzeigen, wo die zurückgegebene 'manualIncrement'-Funktion aufgerufen würde. – mkalish

+0

danke nochmal! Ich habe meinen Code oben aktualisiert. Ich habe versucht, die, die Sie geschrieben haben, aber es schien nicht für mich arbeiten, also ging ich auf eine andere Weise, die immer noch nicht funktioniert. Wenn Sie irgendwelche Kommentare weiter haben, würde es sehr geschätzt werden. –

Verwandte Themen