@sieruss
PHP разработчик

Остановить таймер с помощью checknet js?

У меня проблема Я создаю онлайн-тест. Я проверяю, что интернет был отключен с помощью плагина jquery checknet. Если интернет отключается, тоже отключает все кнопки. Но я не могу остановить время, отведенное для теста. Или, когда интернет отключен, мне нужно добавить одну секунду к обратному отсчету к каждой секунде
yXO0C.jpg
Вот у меня интернет работает и все в порядке
bv4Gw.jpg

Как можно остонавит или +1 за каждий секунд? Проблема в том, что один из них полный JS. другой - Jquery

Таймер, который нужно остановить:

function updateExamTimer() {

    var timeLeft = EXAM_TIME_LEFT - elapsedTime;
    elapsedTime += 1;

    var minutes = Math.floor(timeLeft / 60);
    var seconds = timeLeft % 60;
    var hours = Math.floor(minutes / 60);
    var minutes = minutes % 60;

    if (hours < 10) { hours = '0' + hours; }
    if (minutes < 10) { minutes = '0' + minutes; }
    if (seconds < 10) { seconds = '0' + seconds; }


    if (timeLeft <= 0) {

        alert('Sizning imtihon topshirish muddatingiz yakunlandi.');

        // If we're in ajax mode, submit via ajax - otherwise, redirect to the completion page
        if (jQuery('#exam-ui').length) {
            finishExam(false);
        } else {
            document.location.href = 'complete.php?id=' + EXAM_REQUEST_ID;
        }

    } else {
        jQuery('#exam-time-left').val(hours + ':' + minutes + ':' + seconds);
        setTimeout('updateExamTimer()', 1000);
    }

}


checknet js (jquery plugin)

(function(b) {
    b.fn.checknet = function(a) {
        function c() {
            window.checknet.windowIsActive = document.hidden || document.mozHidden || document.webkitHidden || document.msHidden ? !1 : !0
        }

        function d(a) {
            window.checknet.windowIsActive && b.ajax({
                url: a,
                cache: !1,
                type: "HEAD"
            }).done(function() {
                window.checknet.conIsActive = !0
            }).fail(function() {
                window.checknet.conIsActive = !1
            }).always(function() {
                window.checknet.conIsActive ? (b("#netWarn").length && b("#netWarn").fadeOut("fast", function() {
                        b(this).remove()
                    }), b(".tempDisabled").removeAttr("disabled").removeClass("tempDisabled")) :
                    (b("#netWarn").length || (b("body").prepend('<p id="netWarn">' + window.checknet.config.warnMsg + "</p>"), b("#netWarn").fadeIn("fast")), b('input[type="button"]').attr("disabled", "disabled").addClass("tempDisabled"))
            });
            setTimeout(function() {
                d(window.checknet.config.checkURL)
            }, window.checknet.config.checkInterval)
        }
        a = a || {};
        a.checkURL = a.checkURL || window.location.href;
        a.checkInterval = a.checkInterval || 5E3;
		EXAM_TIME_LEFT +=1;
        a.warnMsg = a.msg || "Tizim tarmoqdan uzildi. Balki internetinigz o'chgandir? Ushbu yozuv yo'qolganiga qadar, testdan foydalanmang!. "; - 1 === a.checkURL.indexOf("http") && (a.checkURL = "http://" + a.checkURL);
        window.checknet = {
            windowIsActive: !0,
            conIsActive: !0,
            config: a
        };
        "undefined" !== typeof document.hidden ? document.addEventListener("visibilitychange", c) : "undefined" !== typeof document.webkitHidden ? document.addEventListener("webkitvisibilitychange", c) : "undefined" !== typeof document.mozHidden ? document.addEventListener("mozvisibilitychange", c) : "undefined" !== typeof document.msHidden && document.addEventListener("msvisibilitychange", c);
        d(window.checknet.config.checkURL)
    }
})(jQuery);
  • Вопрос задан
  • 1865 просмотров
Решения вопроса 1
Athanor
@Athanor
Лайк + Решение: не жмись, нажми
ваш таймер работает через рекурсивный setTimeout. Каждую секунду вызывается функция updateExamTimer, которая в конце выполнения планирует отложенный вызов себя же через 1 секунду.

Особенность функции setTimeout заключается в том, что при вызове она возвращает timerId, который если успеть передать в clearTimeout, то таймер(на выполнение функции updateExamTimer) отменится.

Следовательно, вам нужно изменить код так, чтоб при отключении интернета вызывался clearTimeout и в него передавался timerId, который вам нужно куда-то сохранять каждый раз при вызове setTimeout
После включения интернета, вам потребуется снова вызвать setTimeout('updateExamTimer()', 1000);, чтоб запустить таймер

Подробней

НО так же у вас фигурирует загадочная переменная EXAM_TIME_LEFT, которая неизвестно откуда берется. Если это константа и она просто объявлена выше по коду, описанный мной вариант, скорее всего, будет работать, если она прилетает с сервера(и при обновлении страницы она меняется), то ничего работать не будет и отключать таймер придется на сервере в том числе.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
StepanTur
@StepanTur
fullstack node js react native mobile developer
function updateExamTimer() {

    var timeLeft = EXAM_TIME_LEFT - elapsedTime;
    elapsedTime += 1;

    var minutes = Math.floor(timeLeft / 60);
    var seconds = timeLeft % 60;
    var hours = Math.floor(minutes / 60);
    var minutes = minutes % 60;

    if (hours < 10) { hours = '0' + hours; }
    if (minutes < 10) { minutes = '0' + minutes; }
    if (seconds < 10) { seconds = '0' + seconds; }


    if (timeLeft <= 0) {

        alert('Sizning imtihon topshirish muddatingiz yakunlandi.');

        // If we're in ajax mode, submit via ajax - otherwise, redirect to the completion page
        if (jQuery('#exam-ui').length) {
            finishExam(false);
        } else {
            document.location.href = 'complete.php?id=' + EXAM_REQUEST_ID;
        }

    } else {
        jQuery('#exam-time-left').val(hours + ':' + minutes + ':' + seconds);
   if(navigator.onLine) {
    // Устройство в интернете
setTimeout('updateExamTimer()', 1000);
} else {
    // Устройство не подключено к интернету
}
    }

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы