2017-12-20 2 views
0

Nachdem ich mich hier umgesehen habe, konnte ich keine Lösung für mein Problem finden. Was ich habe, ist folgendes ProblemclearInterval stoppt das Intervall nicht

function movement(mov, element) { 
 
    canvasMov = document.getElementById('xy_canvas'); 
 
    ctxMov = canvasMov.getContext("2d"); 
 
    wMov = canvasMov.width; 
 
    hMov = canvasMov.height; 
 
    if (element != 'xy_canvas') { 
 
    my_range = document.getElementById(element); 
 
    if (mov) { 
 
     my_interval = setInterval(function() { 
 
     if (my_range != null) 
 
      touchEvents(my_range.value); 
 
     sendMovements(element); 
 
     }, 160); 
 
    } else { 
 
     clearInterval(my_interval); 
 
     console.log(element, mov); 
 
     my_range.value = 0; 
 
    } 
 
    if (my_range.value == 0) 
 
     clearInterval(my_interval); 
 
    } else { 
 
    if (mov) { 
 
     my_interval = setInterval(function() { 
 
     eventsMove(); 
 
     sendMovements(); 
 
     }, 160); 
 
    } else { 
 
     clearInterval(my_interval); 
 
     console.log(element, mov); 
 
    } 
 

 
    } 
 
}
<div class="col12 fl"> 
 
    <input type="range" id="alt_range" min="-1" max="1" value="0" step="0.2" class="slider" oninput="movement(true,'alt_range')" onmouseup="movement(false,'alt_range')"> 
 
</div>

clearInterval nicht die intervalm stoppt vielleicht bin ich hier etwas fehlt, irgendwelche Vorschläge bitte?

+0

Über einen entsprechenden Hinweis: in die Gewohnheit Ihrer Variablen mit 'var' erklärt oder' let' so schnell wie möglich - an einem dieser Tage werden Sie Ihre Haare, weil zwei unabhängige Funktionen Strang ziehen gehe weiterhin auf eine nervtötende Variable mit dem Namen 'x', die bis zum globalen Gültigkeitsbereich durchgebrannt ist, weil du' x = irgendwas' anstelle von 'varx = etwas' geschrieben hast. – vzwick

Antwort

2

Wenn Sie eine neue Intervallfunktion starten, stoppen Sie die alte nicht. clearInterval(my_interval) stoppt dann nur den letzten, der gestartet wurde, aber ältere laufen weiter. Sie müssen clearInterval(my_interval); vor jedem der setInterval() Anrufe aufrufen.

Und da alle Pfade durch den Code schließlich entweder setInterval() oder clearInterval() aufrufen, könnten Sie einfach clearInterval(my_interval) einmal am Anfang der Funktion tun.

function movement(mov, element) { 
 
    canvasMov = document.getElementById('xy_canvas'); 
 
    ctxMov = canvasMov.getContext("2d"); 
 
    wMov = canvasMov.width; 
 
    hMov = canvasMov.height; 
 
    clearInterval(my_interval) 
 
    if (element != 'xy_canvas') { 
 
    my_range = document.getElementById(element); 
 
    if (mov) { 
 
     if (my_range.value != 0) { 
 
     my_interval = setInterval(function() { 
 
      if (my_range != null) 
 
      touchEvents(my_range.value); 
 
      sendMovements(element); 
 
     }, 160); 
 
     } 
 
    } else { 
 
     console.log(element, mov); 
 
     my_range.value = 0; 
 
    } 
 
    } else { 
 
    if (mov) { 
 
     my_interval = setInterval(function() { 
 
     eventsMove(); 
 
     sendMovements(); 
 
     }, 160); 
 
    } else { 
 
     console.log(element, mov); 
 
    } 
 

 
    } 
 
}
<div class="col12 fl"> 
 
    <input type="range" id="alt_range" min="-1" max="1" value="0" step="0.2" class="slider" oninput="movement(true,'alt_range')" onmouseup="movement(false,'alt_range')"> 
 
</div>

+0

Danke Barmar, es funktioniert! Ich musste nur hinzufügen var my_interval = null; vor der Funktion, denn wenn Sie ClearInterval am Anfang aufrufen, muss "my_interval" definiert werden. –

+0

Natürlich, wenn Sie eine globale Variable verwenden, sollten Sie sie außerhalb der Funktion deklarieren und initialisieren. – Barmar

0

Alles, was Sie tun müssen, ist definieren my_interval an der Spitze, so etwas wie

var my_interval = null; 

Im Moment sind Sie my_interval in Ihrem if Zustand erzeugt wird, ist es für den Rest des Codes versteckt.

+1

Das ist wahrscheinlich nicht das Problem. Wenn 'var' nicht verwendet wird, wird die Variable im Bereich angezeigt, in diesem Fall trifft sie schließlich auf 'window' (mit anderen Worten, in der Frage' my_interval = something' ist das gleiche wie 'window.my_interval = something') . - Wenn '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'var's in JavaScript nicht gemacht werden, funktionieren Funktionen. (In der neuen ES6 'let' und' const', dann, ja, '{}' s Bereiche erstellen.) – acdcjunior

+0

@acdcjunior Ich sehe, aber dann sollte der Code arbeiten, das Intervall zu löschen. : -S – progrAmmar

+0

Ja, das denke ich auch: D Es gibt wahrscheinlich noch etwas anderes. Vielleicht werden diese 'wenn' nicht ausgeführt werden, ich weiß nicht ... – acdcjunior