2010-12-01 19 views
7

Ich arbeite auf ui Tabs mit jQuery gebaut. Alles funktioniert bis auf ein Problem - ich habe eine setInterval ausgeführt, die eine Funktion ausführt, die einen Trigger ("klick") ausführt, so dass es nach 5000 Millisekunden zur nächsten Registerkarte geht. Wenn der Benutzer manuell auf eine Registerkarte klickt, wird der Zeitgeber für das SetInterval nicht um 0 neu gestartet. Zum Beispiel, wenn ein Benutzer auf Tab1 bei 0 Millisekunden starten und auf Tab2 um klicken soll 2000 Millisekunden geht der setInterval nicht auf 0 zurück, er würde bei 2000 anfangen und auf 5000 Millisekunden laufen und würde dann zu Tab3 gehen. Ich verstehe, warum es passiert, ich frage mich nur, ob es eine Möglichkeit gab, das setInterval-Timing neu zu starten, ohne ein clearInterval() zu machen und ein komplett neues setInterval() zu erstellen. Jeder Einblick würde geschätzt werden.Neustart eines setInterval() in Javascript/jQuery (ohne clearInterval)

aktualisieren

Danke für die Antworten - Der Grund, warum ich clearInterval Verwendung war, weil ich hatte Probleme, wie Sie den Code in einer Art und Weise zu schreiben, wo die clearInterval die setInterval aufhören würde völlig zu vermeiden versuchte. Der Code wird eingerichtet, um zu verfolgen, wann immer ein Benutzer auf eine Registerkarte geklickt hat. Das Problem ist, dass die Auto-Change-Funktion einen Trigger ("Klick") verwendet, so dass sie die ClearInterval-Funktion ausführt, die ich auch geschrieben habe, wenn sich die Tabs automatisch ändern. Es scheint von alleine ziemlich gut zu laufen, aber sobald der Benutzer auf Registerkarten klickt, verhält sich setInterval ungewöhnlich und wechselt unvorhersehbar die Registerkarten. Ich vermute, was passiert ist, dass mehrere setIntervals auf einmal laufen ... Hier ist der Code (Wenn Sie es nicht schon erraten haben, bin ich ziemlich neu bei javascript/jquery). Ich habe Teile auskommentiert, so dass es funktioniert, aber es funktioniert immer noch nicht so, wie ich es beabsichtigt hatte (vom ersten Post).

// auto change tabs 
      if(options.interval) { 

       function timerCom() { 
        if(!$(".controller").hasClass('paused')) { 
         var i = $(".tab-current > a").attr("rel"); 
         //alert(i); 
         if(i == 3) {i = 0}; 
         $container 
          .find('a') 
          .eq(i) 
          .trigger('click'); 
        }  
       } 

       //$("#promo-items > li > a").click(function() { 
        //var timer; 
        //if(timer != null) {clearInterval(timer);} 
        timer = setInterval(timerCom, options.interval); 

       //}); 

      } 
+0

Willkommen bei SO!Bitte bearbeiten Sie Ihre Frage nur, wenn Sie weitere Informationen benötigen. Verwenden Sie Kommentare für spezifische Fragen zu Antworten. SO ist kein Forum, das Antwortfeld ist ausschließlich für Antworten auf die Frage reserviert. –

Antwort

8

Nein, es gibt keine Möglichkeit, einen Timer von setInterval auf neu starten, ohne den Timer zu löschen.

3

Sie können Intervalle oder Zeitüberschreitungen nicht wirklich ändern, löschen Sie sie nur. Das heißt, es sollte eine einfache Sache sein, eine Funktion zu erstellen, die das Intervall löscht und dann eine neue, aber identische, sofort mit einem neuen Zeitwert startet.

var intervalID; 
var resetTimer = function() { 
    if (intervalID) { clearInterval(intervalID) }; 
    intervalID = setInterval(function() { 
    console.log('doing stuff!'); 
    }, 5000); 
}; 
+5

Diese Art der Verwendung von Klammern macht den Code fast unlesbar: P. Zahnspangen sollten auf ihren eigenen Linien sein –

+2

Ich habe kein Interesse an der Debatte, aber tatsächlich sagt der Kodierungsstandard von Google: "Wegen der impliziten Semikolon-Einfügung starten Sie Ihre geschweiften Klammern immer in der gleichen Zeile wie alles, was sie öffnen. " http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml – DaveWalley

1
timer = setInterval(function() { 
    timerCom(); 
}, options.interval); 
0

Ich weiß, dass dieser Beitrag weit über 2 Jahre alt ist, aber ich lief gerade ein ähnliches Problem in und fand ich eine Lösung.

Ich schrieb einen Bildwechsler, der nach einer bestimmten Zeit automatisch zum nächsten Bild wechselte, und jedes Mal, wenn ich auf die Navigationstasten klickte, wurden die Übergänge doppelt verschoben.

Hier ist meine Lösung:

Sprechen Sie das Intervallvariable (timer in Ihrem Fall) etwas global.

d. H. Im Abschnitt options (vorausgesetzt, es wurde früher definiert und dann später zugewiesen), fügen Sie eine Null timer Variable hinzu.

var options = { 
'interval', 
//Other variables 
'timer', 
}; 

Rufen Sie dann zweimal clearInterval, wenn Sie das Click-Ereignis behandeln.

$("#promo-items > li > a").click(function() { 

if(options.timer != null) { 
clearInterval(options.timer); 
clearInterval(options.timer); 
} 

options.timer = setInterval(timerCom, options.interval); 

}); 

Arbeitete wie ein Charme für mich.

Nochmals, entschuldigen Sie, wenn dies wayyyy zu spät ist.