Mam strumień społecznościowy, który chcę zaktualizować za pomocą setInterval. SetInterval musi zostać zatrzymany, gdy ktoś zostawia komentarz lub odpowiedź, w przeciwnym razie usuwa zawartość textarea, ponieważ jest zagnieżdżona wewnątrz aktualizowanej treści.Jak ustawić setInterval w stanie gotowym, zatrzymać się na fokusie textarea, a następnie rozpocząć skupienie na textarea?
Próbuję użyć tego kodu, zmodyfikowanego, z innej odpowiedzi, ale nie działa, ponieważ nie zatrzyma stopera po pierwszym cyklu timera setInterval.
HTML ...
<div id="social_stream_content">
<textarea id="comments" rows="4" cols="50" placeholder="Set focus to stop timer"></textarea>
</div>
JS ...
function auto_load(){
data = '<textarea id="comments" rows="4" cols="50" placeholder="Set focus to stop timer..."></textarea>';
$("#social_stream_content").html(data);
alert("auto_load invoked");
}
var myInterval;
var interval_delay = 10000;
var is_interval_running = false; //Optional
$(document).ready(function(){
auto_load(); //Call auto_load() function when document is Ready
//Refresh auto_load() function after 10000 milliseconds
myInterval = setInterval(interval_function, interval_delay);
$('textarea').focus(function() {
console.log('focus');
clearInterval(myInterval); // Clearing interval on window blur
is_interval_running = false; //Optional
}).focusout(function() {
console.log('focusout');
clearInterval(myInterval); // Clearing interval if for some reason it has not been cleared yet
if (!is_interval_running) //Optional
myInterval = setInterval(interval_function, interval_delay);
});
});
interval_function = function() {
is_interval_running = true; //Optional
// Code running while textarea is NOT in focus
auto_load();
}
Edycja: I został uaktualniony kod na to wszystko jak testowany na JSfiddle. Licznik zatrzyma się, jeśli natychmiast ustawisz ostrość na polu tekstowym komentarza po zamknięciu alarmu w gotowości dokumentu.
Po usunięciu fokusu i zakończeniu pierwszego cyklu interwału czasomierz nie zatrzymuje się ponownie. Wydarzenie fokusowe wydaje się przestać strzelać.
Czy to dlatego, że obszar tekstowy komentarza jest zagnieżdżony w aktualizowanym obszarze zawartości? Wyciągam włosy. Jeśli usuniemy zagnieżdżenie, działa zgodnie z oczekiwaniami.
Moim zastrzeżeniem jest to, że tekst komentarza zawsze będzie zagnieżdżony w dziale zawartości strumienia społecznościowego, z oczywistych powodów.
Aby zaktualizować pytanie dalej: Czy istnieje sposób na zatrzymanie interwału, aby zatrzymać się na fokusie textarea przy użyciu jquery, podczas gdy skoncentrowany element jest zagnieżdżony w elemencie aktualizującym? Dlaczego zdarzenie fokusowe przestaje strzelać po zakończeniu pierwszego interwału?
Edytuj: Kompletny kod JS, działający w sposób poprawny, z włączonym rozwiązaniem Jeremy'ego Klukana, dla każdego, kto robi ten sam typ projektu.
JS PRACY:
function auto_load(){
data = '<textarea id="comments" rows="4" cols="50" placeholder="Set focus to stop timer..."></textarea>';
$("#social_stream_content").html(data);
alert("auto_load invoked");
}
var myInterval;
var interval_delay = 10000;
var is_interval_running = false; //Optional
$(document).ready(function(){
auto_load(); //Call auto_load() function when document is Ready
//Refresh auto_load() function after 10000 milliseconds
myInterval = setInterval(interval_function, interval_delay);
$('body').on('focus', '#social_stream_content textarea', function (event) {
console.log('focus');
clearInterval(myInterval); // Clearing interval on window blur
is_interval_running = false; //Optional
}).on('focusout', '#social_stream_content textarea', function(event) {
console.log('focusout');
clearInterval(myInterval); // Clearing interval if for some reason it has not been cleared yet
if (!is_interval_running) //Optional
myInterval = setInterval(interval_function, interval_delay);
});
});
interval_function = function() {
is_interval_running = true; //Optional
// Code running while textarea is NOT in focus
auto_load();
}
Łącze do JSfiddle, które przetestowałem z ... https://jsfiddle.net/a60nj1pf/ –