Как я могу выполнить setTimeout () только, когда пользователь присутствует (с движением мыши) с jQuery - PullRequest
0 голосов
/ 27 октября 2010

У меня есть функция, которая обновляет <div /> через AJAX:

function update() {
    <!-- .ajax() --> 
    setTimeout(update(), 3000);}
}

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

Как это можно сделать?Заранее спасибо!

Правка: наверное я плохо объяснил.Мне нужно знать способ обновления только при наличии активности.Как Facebook делает со своей новостной лентой, главной страницей.Спасибо!

Ответы [ 4 ]

2 голосов
/ 27 октября 2010

Вы можете использовать обработчик mousemove для отслеживания того, когда пользователь последний раз перемещался, и тогда процесс будет происходить только в том случае, если он последний раз перемещал мышь в течение X секунд. Но, конечно, если пользователь сидит там и читает что-то, или если он человек, ориентированный на клавиатуру, он будет скучать по тому, что он там ... Поэтому вы, вероятно, захотите взглянуть на keydown а также.

Вот пример перемещения мыши :

jQuery(function($) {
    var count = 0, lastmove = new Date();

    $(document).mousemove(function() {
        ++count;
        lastmove = new Date();
        $('#display').html("Moved " + count + " times");
    });

});​

Тогда ваш код обновления может сделать это:

function update() {
    if (new Date() - lastmove < 60000) { // 60 seconds
        // Really do the update
    }
    else {
        // Check back in a few seconds
        setTimeout(update, 3000);
    }
}

Не по теме , но у вас есть ошибка в вашем коде обновления. У вас есть:

setTimeout(update(), 3000);

... который немедленно вызовет update и затем попытается использовать его возвращаемое значение, чтобы запланировать что-то, что произойдет через три секунды. Если вы хотите, чтобы звонок на update планировался через три секунды, отмените () после него:

setTimeout(update, 3000);
1 голос
/ 27 октября 2010

Я думаю, что мог бы закончить с чем-то вроде этого.Избегает арифметики даты.Только волнует, была ли какая-то активность с момента последнего обновления ().

window.activeFlag = false;
window.updateDelay = 3000;

$(document).bind('mousemove scroll keydown', function(){ activeFlag = true; });

function update() {
  if(activeFlag) {
    doWork();
    activeFlag = false;
  }
}

window.setTimeout(update, updateDelay);

edit: я обнаружил в коде ошибкуБолее уместно следующее:

window.activeFlag = false;
window.updateDelay = 3000;

$(document).bind('mousemove scroll keydown', function(){ activeFlag = true; });

function update() {
  if(activeFlag) {
    doWork();
    activeFlag = false;
  }
  window.setTimeout(update, updateDelay);
}

update();
1 голос
/ 27 октября 2010

Я думаю, что нет простого способа определить, присутствует ли пользователь

Я бы использовал комбинацию mousemove, scroll, keypress.

0 голосов
/ 27 октября 2010
var bUpdate = false;
function update() {

   if(bUpdate){
       ///perform your ajax request
   }
}

$(document).mousemove(function(){
    bUpdate = true;
    setTimeout(function(){bUpdate=false;}, 3000);}
});
...