Я бы справился с этим на клиенте. Создайте объект для инкапсуляции функций.
Что-то вроде:
var UserInactivityMonitor = UserInactivityMonitor || {};
UserInactivityMonitor = (function (module) {
var inactivityIndex;
var promptIndex;
var timer;
module.startInactivityMonitor = function() {
module.timerTick();
};
module.timerTick = function() {
inactivityIndex--;
if (inactivityIndex === 0) {
module.fireInactivityAlert();
}
if (inactivityIndex === promptIndex) {
module.fireIdlePrompt();
}
timer = setTimeout(module.timerTick, 1000);
};
module.fireIdlePrompt = function() {
var response = confirm('are you stil there?');
if (response === true) {
module.resetInactivityIndex();
}
};
module.resetInactivityIndex = function() {
inactivityIndex = 15;
promptIndex = 5;
};
module.fireInactivityAlert = function() {
alert('Inactivity alert!');
};
module.initialize = function() {
module.resetInactivityIndex();
module.startInactivityMonitor();
};
return module;
})(UserInactivityMonitor || {});
Набор inactivityIndex на количество секунд, которое пройдет перед срабатыванием пассивность событий. Установите promptIndex на количество оставшихся секунд, когда пользователь будет запрошен, если они все еще там. Приведенный выше код устанавливает тайм-аут бездействия до 15 секунд, и приглашение простоя будет вызываться с оставшейся отметкой 5 секунд.
На странице загрузки запустить таймер неактивности:
$(function() {
UserInactivityMonitor.initialize();
});
На любой запрос AJAX, сброс счетчика:
$("#fooButton").on('click', function() {
$.ajax(
{
url: $("#buttonClickPostUrl").val(),
data: {
someData: 'data'
},
type: 'POST',
complete: function() {
UserInactivityMonitor.resetInactivityIndex();
}
});
});
Если сервер поддерживает состояние сеанса, то вы хотите сделать запрос назад к серверу, чтобы убить сеанс и, возможно, направьте браузер на соответствующую страницу для события. Вы сделали бы это в функции fireInactivityAlert().
Возможно, мне что-то не хватает, но я думаю, что вы можете сделать это без фильтра действий. Я бы предположил, что таймер будет сброшен при каждом представлении рендеринга (если он войдет в систему), пожар через пятнадцать минут, а затем сбросьте их после ответа. Если это так, я могу придумать довольно простой дизайн. –
отличный вопрос! –