Почему ClearInterval() не работает?
-
14-12-2019 - |
Вопрос
Я новичок в JavaScript, и у меня возникли проблемы с этим скриптом.это часть веб-игры, и сценарий должен обновлять страницу до тех пор, пока игрок не выиграет или не проиграет.по какой-то причине обновление не прекращается, я включил функцию оповещения, чтобы проверить, работают ли функции, и получаю оповещения, но страница все равно продолжает обновляться.Что я делаю не так?
var t;
$(document).ready(function () {
intervals();
});
function intervals() {
t = self.setInterval('refreshData()', 10000);
}
function youWin() {
var f = $('#status:contains("YOU ARE THE WINNER!")');
if (f.length > 0) {
alert("YOU ARE THE WINNER!");
t = clearInterval(t);
}
}
function youlose() {
var f = $('#status:contains("You lost!")');
if (f.length > 0) {
alert("You lost!");
t = clearInterval(t);
}
}
function refreshData() {
$('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame');
youWin();
youlose();
}
Решение
Вам необходимо исправить ссылку на self
и исправить .load()
вызов.
.load()
является асинхронным, поэтому он не завершается до вашего вызова youWin()
и youLose()
сразу после этого.Вам нужна функция завершения, чтобы вы могли проверить выигрыш или проигрыш после .load()
завершается успешно.
refreshData()
должно быть структурировано следующим образом:
function refreshData() {
$('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame', function() {
youWin();
youlose();
});
}
Вам также следует изменить это:
t= self.setInterval('refreshData()',10000);
к этому:
t = window.setInterval(refreshData, 10000);
я этого не вижу self
был даже определен, так что это также могло быть причиной вашей проблемы, и вам следует использовать ссылку на функцию напрямую, а не вводить строку.
И в качестве проблемы очистки вам следует изменить оба случая:
t = clearInterval(t);
к этому:
clearInterval(t);
Вот очищенная версия кода, в которой также исключены глобальные переменные и ненужные определения функций:
$(document).ready(function() {
var t = window.setInterval(function() {
$('#ajaxGame').load('RefreshCurrentPlayerServlet #ajaxGame', function() {
youWin();
youlose();
});
}, 10000);
function youWin() {
if ($('#status:contains("YOU ARE THE WINNER!")').length) {
alert("YOU ARE THE WINNER!");
clearInterval(t);
}
}
function youlose() {
if ($('#status:contains("You lost!")').length) {
alert("You lost!");
clearInterval(t);
}
}
});