Я хочу, чтобы таймер работал в фоновом режиме, даже если я перехожу на другую страницу веб-сайта, используя только javascript или jquery

#javascript #jquery #timer

Вопрос:

Я создал таймер, используя javascript и jquery, и я сохраняю временные метки в базе данных, когда таймер приостанавливается, возобновляется, запускается и останавливается. Здесь используется фреймворк интерфейса DJango. Но если я перейду на другую страницу моего веб-сайта на той же вкладке браузера, таймер не работает. Я хочу, чтобы таймер продолжал работать, если я не нажму на кнопку паузы. Как я могу добиться этой функциональности?

HTML-КОД:

 <div id="display"><span id="hours">00</span>:<span id="mins">00</span>:<span id="secs">00</span></div>
    <!--<div id="display2">00:00:00</div>-->
    <div class="button">
        <button id="startPause" onclick="startPause()">Start</button>
        <button id="Pause" onclick="Pause()">Pause</button>
        <div id="emptyDiv"></div>
        <a href='review'><button id='update_btn' class = 'btn btn-primary'>Mark for Review</button></a>

        <button id="complete" onclick="complete()">Mark as Complete</button>
        <div id="emptyDiv"></div>
</div>
 

КОД JAVASCRIPT:

         let sec = 00;
        let min = 00;
        let hour = 00;
        let total_sec = localStorage.getItem({{ object.id }} "/total-seconds")% 1000;
        console.log(total_sec)
        let count = null;

        let ssbtn = document.getElementById('startPause');
        let stopbtn = document.getElementById('complete');
        let display = document.getElementById('display');
        let total_time = document.getElementById('total_time');
        let work_done = document.getElementById('work_done');
        let work_done_time = document.getElementById('work_done_time');
        let ssbtn_state = 'off';
        let hrspan=document.getElementById("hours")
        let secspan=document.getElementById("secs")
        let minspan=document.getElementById("mins")

        
        let myState;
        
        hour = Math.floor(total_sec / 3600);
        min = Math.floor((total_sec - (hour * 3600)) / 60);
        sec = (total_sec - ((hour * 3600)   (min * 60)));
        window.addEventListener('load', (event) => {
            document.getElementById("Pause").disabled = true;
            secspan.innerHTML=sec;
            minspan.innerHTML=min;
            hrspan.innerHTML=hour;
        });

        function Pause(){
            myState='off';
            ssbtn_state="pause";
            document.getElementById("Pause").disabled = true;
            ssbtn.disabled = false;
            localStorage.setItem("state"   window.location.pathname, myState);
            localStorage.setItem({{ object.id }} "/total-seconds",total_sec)
            {% comment %} pause timestamp {% endcomment %}
            ajax_call(0,Math.ceil(Number(new Date())/1000),0, 0, 'OG');
            clearInterval(count)
        }
        function startPause() {
            myState=localStorage.getItem("state/task/"   {{ object.id }}  "/");
            myState='on';
            ssbtn.disabled = true;
            document.getElementById("Pause").disabled = false;
            if (myState!= null){
                ssbtn_state="resume";
                {% comment %} resume timestamp {% endcomment %}
                ajax_call(0, 0, Math.ceil(Number(new Date())/1000), 0, 'OG');
                if (myState==='on'){
                    
                    count = setInterval(() => {
                    if (sec < 59) {
                        sec  ;
                        total_sec  ;
                        secspan.innerHTML=sec;
                    } else {
                        total_sec  ;
                        sec = 0;
                        secspan.innerHTML=sec;
                        min  ;
                        minspan.innerHTML=min;
                    }
                    if (min > 59) {
                        min = 0;

                        minspan.innerHTML=min;
                        hour  ;
                        hrspan.innerHTML=hour;
                    }
                    
                    console.log("Timer running")
                    
                    },1000)}


            }
            else {
                {% comment %} Start timestamp {% endcomment %}
                ajax_call(Math.ceil(Number(new Date())/1000), 0, 0, 0, 'OG');
                ssbtn_state="on"
                console.log(myState,"is null how??")
            }

            
        }

    /*--------------------------------------------------------------------------------*/
    
    function complete(){
        localStorage.setItem({{ object.id }} "/total-seconds",total_sec)
        var result = confirm("Are you sure?");
        if(result){
            clearInterval(count);
            
            stopbtn.disabled = true;
            
            work_done.style.display = 'block';
            ajax_call(0,0,0,Math.ceil(Number(new Date())/1000), 'CM');
                if(hour == 0){
                        work_done_time.innerHTML = min ' minutes ' sec ' seconds';
                } else{
                    work_done_time.innerHTML = hour ' hours ' min ' minutes ' sec ' seconds';
                }
            }
    }
    

    function ajax_call(S_time, P_time, R_time, ST_time, stage = 'NE'){
        $.ajax({
            url: '/update_counter/',
            data: {
                'taskID': {{ object.id }},
                'S_Time': S_time,
                'P_Time': P_time,
                'R_Time': R_time,
                'ST_Time': ST_time,
                'Stage': stage,
                'csrfmiddlewaretoken': '{{ csrf_token }}',
            },
            type: 'POST'
        }).done(function(response){
            console.log(response);
        });
    };
    {% comment %}  S_Time- START Time
                    P_Time- pAUSE Time
                    R_Time - rESUME Time
                    ST_Time - STOP TIME 
    {% endcomment %}
 

Комментарии:

1. Вы используете Chrome? developers.google.com/web/updates/2017/03/background_tabs

2. Как именно работает таймер? Отправьте некоторый код.

3. Да, я использую chrome.

4. Я добавил код