Ich habe einen sozialen Stream, den ich mit setInterval aktualisieren möchte. SetInterval muss gestoppt werden, wenn jemand einen Kommentar oder eine Antwort hinterlässt, ansonsten löscht es den Inhalt der Textarea, da es innerhalb des zu aktualisierenden Inhalts geschachtelt ist.Wie setze ichinterval auf ready, stoppe auf textarea focus, starte dann auf textarea focusout?
Ich versuche, diesen Code, modifiziert, von einer anderen Antwort zu verwenden, aber es scheitert darin, dass es den Timer nach dem ersten Zyklus des setInterval-Timers nicht stoppt.
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();
}
Edit: Ich habe den Code aktualisiert, alles umfassen, wie auf JSfiddle getestet. Der Timer wird angehalten, wenn Sie nach dem Schließen des Alerts im Dokument ready sofort den Fokus auf die Kommentartextarea setzen.
Nachdem der Fokus entfernt wurde und der erste Zyklus des Intervall-Timers abgeschlossen ist, stoppt der Timer nicht erneut. Das Fokusereignis scheint zu stoppen.
Liegt das daran, dass der Kommentartextarea innerhalb des Inhaltsbereichs verschachtelt ist, der aktualisiert wird? Ich ziehe mir die Haare aus. Wenn ich die Verschachtelung entferne, funktioniert es wie erwartet.
Mein Vorbehalt ist, dass die Kommentartextareas immer aus offensichtlichen Gründen innerhalb des Content-Div des sozialen Streams verschachtelt werden.
Also, um die Frage weiter zu aktualisieren: Gibt es eine Möglichkeit, den Intervall-Timer auf Textfeld Fokus mit jquery zu stoppen, während das fokussierte Element im Update-Element verschachtelt ist? Warum hört das Fokusereignis nach dem Abschluss des ersten Intervalls auf zu feuern?
Edit: Der komplette JS-Code, funktionierend, mit der Lösung von Jeremy Klukan integriert, für alle, die die gleiche Art von Projekt machen.
ARBEITS 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);
$('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();
}
Der Link zu der JSfiddle, die ich getestet habe mit ... https://jsfiddle.net/a60nj1pf/ –