#javascript #html #jquery
#javascript #HTML #jquery
Вопрос:
Я создаю простой обратный отсчет с индикатором выполнения «инвертировать» — для управления сеансом на моем веб-сайте.
по истечении времени страница будет перезагружена и без блокировки сеанса.
ПРОБЛЕМА: индикатор выполнения работает нормально, но ЕСЛИ пользователь меняет окно или текущую вкладку — и «забыл» открыть страницу — обратный отсчет останавливается. Я не знаю, почему
КОД:
function progress(timeleft, timetotal, $element) {
var progressBarWidth = timeleft * $element.width() / timetotal;
$element.find('div').animate({ width: progressBarWidth }, timeleft == timetotal ? 0 : 1000, "linear");
if(timeleft > 0) {
setTimeout(function() {
progress(timeleft - 1, timetotal, $element);
}, 1000);
}
};
progress(30, 30, $('#progressBar'));
#progressBar {
width: 90%;
margin: 10px auto;
height: 2px;
background-color: #E0E0E0;
}
#progressBar div {
height: 100%;
text-align: right;
padding: 0 0px;
line-height: 2px;
width: 0;
background-color: #FF0000;
box-sizing: border-box;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="progressBar">
<div class="bar"></div>
</div>
JSFIDDLE:https://jsfiddle.net/2tonbd5k
Есть идея решить это?
Я думаю, мне нужно изменить фиксированное значение «timeleft или timetotal» ( 3 минуты) на «реальное время» (пользователь заходит на сайт в 21: 57: 00, тогда «реальное время» для перезагрузки составит 3 минуты — 22:00: 00 вечера). Если пользователь выйдет, анимация тоже остановится, но когда он вернется, js скорректируется до реального времени. Я могу обновить «время» с помощью ASP — но как я могу это сделать?
** для целей тестирования временной интервал в коде составляет всего 30 секунд.
Комментарии:
1. Вы захотите запустить свое время на основе
localStorage.timeStamp = Date.now();
. Конечно, видя, что вы пытаетесь создать индикатор выполнения, почему вы не используетеxhr.onprogress
событие?2. Браузеры будут подавлять повторяющиеся операции таймера в неактивных окнах для экономии процессора, памяти и т. Д
3. т. е. время начала записи с помощью
start = Date.now()
(нет необходимости в объекте Date как таковом — также нет необходимости хранить что-либо в localStorage, если вы не хотите сохранить это время при загрузке страницы) — затем вычислите оставшееся время с помощьюDate.now() - start
4. @JaromandaX хорошая идея — но как таймер узнает, что его нужно остановить через 3 минуты?
5. таймер продолжается, пока
Date.now() - start < 180000
Ответ №1:
все, что вам нужно, это добавить этот скрипт
if ( document.hidden ) { return; }
результат здесь
https://jsfiddle.net/mfkLea7w /