Запускать функцию только после запуска обработчика события - PullRequest
0 голосов
/ 16 декабря 2010

Мне нужно непрерывно получать новые данные каждые 5 минут, но только если пользователь активен на странице.

Вот мои успехи / мысли на данный момент:

  1. Когдадокумент загружен, получить данные и использовать метод setTimeout, чтобы по существу перевести функцию в режим ожидания на 5 минут.
  2. Через 5 минут функция будет запущена, но обновит данные, только если пользователь наведет курсор мыши на разделстраницы.

    setTimeout(getData, 10000) // Shortened time for testing purposes
    function getData(){
        $('#feed').mouseover(function(){
            $('#feed').fadeOut();
            Get the feed
            setTimeout(getData, 10000);
        });
    }
    

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Возможно, есть лучший способ, но для этого примера вам понадобится unbind .mouseover, например, так:

setTimeout(getData, 10000) // Shortened time for testing purposes
function getData(){
    $('#feed').mouseover(function(){
        $('#feed').fadeOut();
        Get the feed
        $(this).unbind('mouseover');
        setTimeout(getData, 10000);
    });
}

В противном случае событие все равно будет связано, и вы будете продолжать вызыватьподача независимо от времени ожидания

0 голосов
/ 16 декабря 2010

Основываясь на ответе @ Jacob, вы можете использовать флаг и через некоторое время установить его на false.Вы можете сохранить свою функцию, которая запускает данные в фоновом режиме, и проверить этот флаг:

var active = true;
var current_timeout = null;

function idle() {
    active = false;
    current_timeout = null; 
}


$('#feed').mousemove(function(){ 
    // maybe another event that does not 
    // constantly fire (but often enough) is enough

    active = true;
    if(current_timeout !== null) {
        window.clearTimeout(current_timeout);
    }
    timeout = window.setTimeout(idle, 180000); // mark not active after 3 minutes
});

window.setInterval(function() {
    if(active) {
        //get data
    }
), 300000);

Я не уверен, хотя, если нет необходимости в запуске интервала, хотя пользователя нет на странице(хотя это ничего не даст, пока active неверно).Вы должны проверить это.

...