Определяет, обновлена ли страница (перезагрузка) или окно закрыто

#javascript #jquery #ajax

#javascript #jquery #ajax

Вопрос:

У меня есть функция таймера, и мне нужно продолжить таймер, когда страница обновляется, и выполнить вызов ajax, когда страница закрыта (это работает). Как я могу это сделать?

У меня есть следующий код:

 $(document).ready(function() {    
    function setTimer(timeSpent) {    
        $.post('./modules/ajax/task.php', {time:timeSpent}, function(data) {    
            $('#timer').timer({
                seconds: data.timerTime
            });

            if(!isNaN(timeSpent)){
                $('#timer').timer('remove');
            }
        }, 'json');    
    }    
    setTimer('start');

    $(window).on('blur', function() {
        setTimer($('#timer').data('seconds'));
    }).on('focus', function() {
        setTimer('resume');
    }).unload(function() {
        var timer     = $('#timer'),
            timeSpent = timer.data('seconds'),
            userID    = timer.data('userid'),
            taskID    = timer.data('taskid');

        $.post('./modules/ajax/task.php', {
            timeSpent: timeSpent, 
            userID: userID, 
            taskID: taskID, 
            save: 'save'
        }, function(data) {})
    });
});
  

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

1. onbeforeunload Событие вызывается перед выгрузкой страницы, но нет встроенного механизма, позволяющего узнать, обновляется ли страница, браузер / вкладка были закрыты или пользователь перешел на другую страницу. Лучшим решением было бы сохранить статическую конечную дату (локально или удаленно) и обратный отсчет до этой даты, независимо от того, в каком состоянии находится страница

2. make an ajax call when the page is closed (this is working) Может работать на локальном сервере, но не на удаленном, наверняка

Ответ №1:

Используйте onbeforeunload событие, которое вызывается перед обновлением страницы, закрытием вкладки или закрытием браузера.

 window.onbeforeunload = function (e) {
    e = e || window.event;

    // For IE and Firefox prior to version 4
    if (e) {
        e.returnValue = 'Any string';
    }

    // For Safari
    return 'Any string';
};
  

Вы можете запустить этот скрипт из консоли браузера и проверить результат.