Как узнать, активен ли браузер / вкладка [дубликат]




Возможные Дубликаты:
есть ли способ определить, если окно браузера в настоящее время не активен?






У меня есть функция, которая вызывается каждую секунду, которую я хочу запустить, только если текущая страница находится на переднем плане, т. е. пользователь не свернул браузер или не переключился на другую вкладку. Он не служит никакой цели, если пользователь не смотрит на него и потенциально интенсивен для процессора, поэтому я не хочу просто тратить циклы в фон.



кто-нибудь знает, как сказать это в JavaScript?



Примечание: я использую jQuery, так что если ваш ответ использует это, это нормально:).

444   6  

6 ответов:

можно использовать focus и blur событий окна:

var interval_id;
$(window).focus(function() {
    if (!interval_id)
        interval_id = setInterval(hard_work, 1000);
});

$(window).blur(function() {
    clearInterval(interval_id);
    interval_id = 0;
});

чтобы ответить на прокомментированный вопрос о "двойном огне" и оставаться в пределах jQuery простота использования:

$(window).on("blur focus", function(e) {
    var prevType = $(this).data("prevType");

    if (prevType != e.type) {   //  reduce double fire issues
        switch (e.type) {
            case "blur":
                // do work
                break;
            case "focus":
                // do work
                break;
        }
    }

    $(this).data("prevType", e.type);
})

Нажмите для просмотра пример кода, показывающий его работу (JSFiddle)

кроме Richard Simões ответом вы также можете использовать API видимости страницы.

if (!document.hidden) {
    // do what you need
}

эта спецификация определяет средство для разработчиков сайта программно определить текущее состояние видимости страницы в заказ на разработку мощных и ЦП эффективных веб-приложений.

узнать еще

Я бы попытался установить флаг на window.onfocus и window.onblur событий.

следующий фрагмент был протестирован на Firefox, Safari и Chrome, откройте консоль и перемещайтесь между вкладками вперед и назад:

var isTabActive;

window.onfocus = function () { 
  isTabActive = true; 
}; 

window.onblur = function () { 
  isTabActive = false; 
}; 

// test
setInterval(function () { 
  console.log(window.isTabActive ? 'active' : 'inactive'); 
}, 1000);

попробовать здесь.

С помощью jQuery:

$(function() {
    window.isActive = true;
    $(window).focus(function() { this.isActive = true; });
    $(window).blur(function() { this.isActive = false; });
    showIsActive();
});

function showIsActive()
{
    console.log(window.isActive)
    window.setTimeout("showIsActive()", 2000);
}

function doWork()
{
    if (window.isActive) { /* do CPU-intensive stuff */}
}

все примеры здесь (за исключением rockacola) требуют, чтобы пользователь физически нажмите на окно, чтобы определить фокус. Это не идеально, так что .hover() лучше:

$(window).hover(function(event) {
    if (event.fromElement) {
        console.log("inactive");
    } else {
        console.log("active");
    }
});

это скажет вам, когда пользователь имеет свою мышь на экране, хотя он все еще не скажет вам, если он находится на переднем плане с мышью пользователя в другом месте.

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

$(window).hover(function() {
  // code here...
});

Comments

    Ничего не найдено.