Обнаружение бездействия пользователя над браузером-исключительно через javascript [дубликат]

этот вопрос уже есть ответ здесь:

при построении монитора, который будет контролировать любую активность в браузере пользователем, например, щелчок кнопки или ввод текста в текстовое поле (а не наведение мыши на документ). Поэтому при отсутствии активности пользователя в течение длительного времени, время сеанса истекает.

нам нужно сделать это без jquery или чего-то подобного. Я могу использовать AJAX. Java сервлет в другом конце предпочтительнее.

2 ответов


вот чистый путь JavaScript чтобы отслеживать время простоя и когда он достигнет определенного предела, выполните некоторые действия, вы можете соответствующим образом изменить и использовать

var IDLE_TIMEOUT = 60; //seconds
var _idleSecondsCounter = 0;
document.onclick = function() {
    _idleSecondsCounter = 0;
};
document.onmousemove = function() {
    _idleSecondsCounter = 0;
};
document.onkeypress = function() {
    _idleSecondsCounter = 0;
};
window.setInterval(CheckIdleTime, 1000);

function CheckIdleTime() {
    _idleSecondsCounter++;
    var oPanel = document.getElementById("SecondsUntilExpire");
    if (oPanel)
        oPanel.innerHTML = (IDLE_TIMEOUT - _idleSecondsCounter) + "";
    if (_idleSecondsCounter >= IDLE_TIMEOUT) {
        alert("Time expired!");
        document.location.href = "logout.html";
    }
}

этот код будет ждать 60 секунд, прежде чем показывать предупреждение и перенаправление, и любое действие "сбросит" счетчик - щелчок мыши, перемещение мыши или нажатие клавиши.

Он должен быть как можно более кросс-браузер, и вперед. Он также поддерживает отображение оставшегося времени, если вы добавляете элемент на свою страницу с помощью Идентификатор SecondsUntilExpire.

Ref:Как узнать время простоя браузера?


проблема с подходом, который вы предлагаете, заключается в том, что сеанс будет тайм-аут, даже если пользователь перемещает мышь или вводит ввод. Поэтому, если у вас есть тайм-аут сеанса, установленный на 20 минут, и пользователь продолжает печатать в течение 21 минуты, сеанс все равно будет тайм-аут, даже если они были "активны". Единственное, что удержит сеанс от тайм-аута, - это новый запрос на сервер.

Решение 1: пусть сервер контролирует сеанс ожидания

Если вы не делаете Ajax-запросы в фоновом режиме, которые будут продолжать обновлять сеанс, вы можете просто установить JavaScript-timeout при загрузке страницы и предупредить пользователя таким образом. Если вы не делаете других запросов к серверу, пока пользователь находится на Вашей странице, нет необходимости усложнять:

setTimeout(function () {
   alert("You've timed out baby!");
}, 1200000); // 20 minutes in millisec (modify to your session timeout)

если пользователь посещает другую страницу или перезагружает страницу, сеанс возобновляется и таймер JavaScript сбрасывается. Если пользователь не делает такого вещь, на сессии будет тайм-аут в то же время пользователь получает ее предупреждение.

решение 2: пусть клиент контролирует тайм-аут сеанса

Если вы хотите, чтобы JavaScript полностью контролировал, как долго длится сеанс, так что он обновляется всякий раз, когда пользователь вводит, перемещает мышь или что-то еще, вам тоже придется делать Ajax-запросы в фоновом режиме на ваш сервер, поэтому сеанс возобновляется. (Это может быть пустой фиктивный запрос, просто что-то, что попадает на сервер)

затем вам придется отслеживать все действия, которые вы считаете "пользовательской активностью" (AnhSirk предлагает один из способов в своем ответе), и сбрасывать таймер таймаута всякий раз, когда такое событие происходит. Если пользователь неактивен слишком долго, вам придется сделать Ajax-запрос на страницу на сервере, что делает сеанс недействительным, а затем вы можете предупредить пользователя о том, что сеанс истек.