2010-05-25 4 views
3

Я хочу написать javascript, который будет убивать sestion на веб-странице, если пользователь не предпринял никаких действий в течение некоторого времени, взятого из конфигурации. Как я могу узнать, что пользователь не делал никаких действий с помощью jQuery.Управление действиями пользователя с помощью jQuery

Большое спасибо.

+3

Почему вы хотите сделать это на стороне клиента? Ваш серверный язык уже должен быть хорошо оснащен механизмом отмены сеансов. – Boldewyn

+1

Установить тайм-аут cookie при создании сеанса? – baloo

ответ

3

Вы могли подстерегать MouseDown и KeyDown событие для всего документа, а затем настроить тайм-аут, чтобы работать, если события не поднимается в течение определенного периода времени:

<html> 
    <head> 
    <script type="text/javascript" src="jquery-1.4.2.min.js"></script> 

    <script type="text/javascript"> 
     var _idleEventId = null; 
     var _idleMaxMilliSeconds = 10000; 

     function OnIdle() { 
      alert('You\'re idle!'); 
     } 

     $(document).bind("mousedown keydown", function() { 
      clearTimeout(_idleEventId); 
      _idleEventId = setTimeout(OnIdle, _idleMaxMilliSeconds); 
     }); 

     $(document).ready(function() { 
      _idleEventId = setTimeout(OnIdle, _idleMaxMilliSeconds); 
     }); 
    </script> 
    </head> 
    <body> 
    Hello World 
    </body> 
</html> 
+0

Спасибо, но что со всеми другими событиями, такими как перемещение мыши, щелчок мышью или любая другая активность пользователя? – eomeroff

+0

просто добавьте их в качестве параметра привязки: bind («mousedown keydown mousemove и т. Д.»), Найдите весь список по адресу http://api.jquery.com/category/events/ –

1

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

var last_seen = 0; 
var timeout = null; 
$('body').mousemove(function() { 
    last_seen = (new Date()).getTime(); 
    window.clearTimeout(timeout); 
    timeout = window.setTimeout(clear_da_session, 10000); 
}); 
/* ... and likewise for things like 
    $('input').focus(); 
    $('a').click(); 
    and 'keypress' events 
*/ 

clearTimeout и setTimeout материал берет на себя что-то (то есть функция clear_da_session) происходит после того, как Некоторое время не уволили ни одно из перечисленных событий.

Однако я хочу еще раз подчеркнуть свой комментарий сверху: не делайте это дома, дети! Используйте все, что имеет ваш серверный язык на борту. Это намного надежнее, чем пытаться отслеживать что-то, что может быть непонятным.

+0

ах, ты избил меня до этого :) – Jeriko

+0

Я думаю, лучше проверить на кузов mousemove только в некоторый промежуток времени не каждый раз! ;-) –

+0

@aSeptik: Как бы вы это сделали? Если вы проверите, например, со вторым шагом 5-6 для перемещения мыши, но пользователь переместит его в секундах от 6 до 10, тогда вы упустите неправильное поведение во втором 10. И, да, это * - кошмар производительности, но эй , кто я, чтобы подвергнуть сомнению причины ОП. – Boldewyn

2

, как использовать печенье только в случае, если: http://www.w3schools.com/JS/js_cookies.asp

тогда я бы, как этот

ПРИМЕЧАНИЕ: только доказательство концепции не тестировался!

setInterval("checkForActivity()", 5000); //set a reasonable time.. 

function checkForActivity() { 
    var user_has_moved_at = (new Date()).getTime(); //generate a time 
    var time_elapsed = getCookie(COOKIE_NAME); //get a time from previous stored 
    //check how many time is passed from last move 
    if ((user_has_moved_at - time_elapsed) < 3600) { 
    //less then 1 hour.. user is still here.. 
     $(document.body).bind('mousemove', 
     function() { 
     // so update the fresh air... 
      setCookie(COOKIE_NAME , user_has_moved_at); 
     // unbind event 
      $(document.body).unbind('mousemove'); 
     }); 

    } else { 
    // more then 1 hour... destroy cookie... user is out 
     setCookie(COOKIE_NAME, null); //destroy cookie 
    } 

}; 
+0

Должен признаться, это хороший трюк. +1 – Boldewyn