NEWS
Script zum Hochzählen bzw. Rundzählen einer Variable
-
Hallo,
ich scheitere gerade an einer vermeintlich einfachen Problemstellung.
Ich lasse mir in Vis drei Widgets auf Basis einer Variable für die Sichtbarkeit anzeigen:
Widget 1 ist sichtbar wenn Variable = 1
Widget 2 ist sichtbar wenn Variable = 2
Widget 3 ist sichtbar wenn Variable = 3
Die Variable setze ich derzeit mit entsprechenden Buttons.
Jetzt wollte ich das Ganze auf eine neue Ebene bringen und die Variable automatisch durch schalten lassen:
Variable beginnt mit 1, nach 10 Sekunden Wert 2, nach 10 Sekunden Wert 3, nach 10 Sekunden Wert 1, nach 10 Sekunden Wert 2,… usw.... immer fleißig im Kreis.
Ich habe schon verschiedene Ansätze versucht. Am besten/ zuverlässigsten war eine Funktion mit einer "IF-Kette" die alle 10 Sekunden aufgerufen wird und mittels IF prüft in welchem Status die Variable gerade ist und dann entsprechend den neuen Wert setzt. Das Funktioniert auch einigermaßen, aber scheint mir nicht der cleverste Ansatz zu sein. Gerade wenn man die Anzahl der durch zu schaltenden Werte noch erhöhen will.
Deshalb meine Frage an die JavaScript-Profis da draußen. Wie kann man die oben genannte Problemstellung am effektivsten umsetzen. Oder ist es vielleicht doch keine so schlechte Idee eine Funktion alle 10 Sekunden wieder auf zu rufen?
Ich hatte auch den Ansatz einer FOR-Schleife (Habe ich in der Berufsschule mal in Anwendungsentwicklung von gehört :D). Leider scheiterte es dabei schon an der richtigen Syntax. Wäre das eine möglich Alternative zur IF-Kette?
MfG,
André
-
Vielleicht so:
var count = 1; var max = 3; function counter() { if(count < max) count++; else count = 1; } setInterval(counter, 10000); // alle 10 s
-
Vielleicht so:
var count = 1; var max = 3; function counter() { if(count < max) count++; else count = 1; } setInterval(counter, 10000); // alle 10 s ```` `
OK, danke. Das kannte ich noch nicht. Mal sehen ob ich meine Funktion noch austausche.
Habe jetzt per "Try & Error" und dem Zusammenkopieren aus verschiedenen Scripten was zusammen geschustert. Meine Funktion zum Hochzählen läuft soweit. Jetzt wollte ich mit ein paar Buttons die Möglichkeit haben das Hochzählen zu unterbrechen und einen entsprechenden Wert für die Viewanzeige setzen (Um manuell eine bestimmte Ansicht aus zu wählen). Leider scheint der letzte Teil meines Scripts nicht zu funktionieren. Das Script zählt einfach weiter hoch. Erkennt vielleicht jemand auf den ersten Blick einen Denkfehler?
!
// Script zum Setzen einer Variable zum Durchschalten von Views in Vis ! // Datenpunkte anlegen createState('vis.viewwechsel.auto', true, {name: 'Viewwechsel automatisch?'}); createState('vis.viewwechsel.view', 0, {name: 'Aktuell angezeigte View'}); createState('vis.viewwechsel.button0', false, {name: 'Button für View 0 gedrückt?'}); createState('vis.viewwechsel.button1', false, {name: 'Button für View 1 gedrückt?'}); createState('vis.viewwechsel.button2', false, {name: 'Button für View 2 gedrückt?'}); createState('vis.viewwechsel.button3', false, {name: 'Button für View 3 gedrückt?'}); createState('vis.viewwechsel.button4', false, {name: 'Button für View 4 gedrückt?'}); ! // Datenpunkt-IDs var idAuto = "javascript.0.vis.viewwechsel.auto"; var idView = "javascript.0.vis.viewwechsel.view"; var idButton0 = "javascript.0.vis.viewwechsel.button0"; var idButton1 = "javascript.0.vis.viewwechsel.button1"; var idButton2 = "javascript.0.vis.viewwechsel.button2"; var idButton3 = "javascript.0.vis.viewwechsel.button3"; var idButton4 = "javascript.0.vis.viewwechsel.button4"; ! // Variablendeklaration und Initialisierung bei Scriptstart var stateAuto = getState(idAuto).val; var stateView = getState(idView).val; var stateButton0 = getState(idButton0).val; var stateButton1 = getState(idButton1).val; var stateButton2 = getState(idButton2).val; var stateButton3 = getState(idButton3).val; var stateButton4 = getState(idButton4).val; ! // Funktion zum Hochzählen der Nummer für die anzuzeigende View function viewwechsel() { if (stateAuto === true) { var status = 0; if (stateView === 0) status = 1; if (stateView === 1) status = 2; if (stateView === 2) status = 3; if (stateView === 3) status = 4; if (stateView === 4) status = 0; setState(idView, status); } } ! // Aufrufen der Funktion zum Hochzählen alle 10 Sekunden function countup() { setTimeout(function () { stateView = getState(idView).val; stateAuto = getState(idAuto).val; viewwechsel(); countup(); }, 10000); } ! // Funktion countup bei Scriptstart anstoßen countup(); ! // Manuelle Unterbrechung des Hochzählens und Setzen der Variable für die Anzeige der View function pushbutton () { if (stateButton0 === true) { setState(stateAuto, false); setState(stateView, 0); } else if (stateButton0 === false) { setState(stateAuto, true); } } ! // Ausführung bei Scriptstart und Änderung des Zustands pushbutton(); ! // Überwachung des Status des Buttons und Ausführung der Funktion on(idButton0, function(dp) { stateButton0 = dp.newState.val; pushbutton(); }); !
Danke.MfG,
André
-
Timer stoppt man mit clearTimeout(timer) bzw. clearInterval(timer):
... var stateView = 0; var max = 4; var timer = null; function counter() { if(stateView < max) stateView++; else stateView = 0; setState(idView, stateView); } function pushbutton () { if (stateButton0 === true) { stateAuto = false; stateView = 0; if(timer) clearInterval(timer); } else { stateAuto = true; timer = setInterval(counter, 10000); // alle 10 s[ } setState(idAuto, stateAuto); setState(idView, stateView); }