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

Возможный дубликат:
Есть ли способ определить, не открыто ли окно браузера?

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

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

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

Ответ 1

Вы использовали бы события 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;
});

Чтобы ответить на комментарий "Double Fire" и остаться в 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)

Ответ 2

В дополнение к ответу Ричарда Симоэса вы также можете использовать API видимости страницы.

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

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

Узнать больше (обновление 2019 года)

Ответ 3

Я бы попытался установить флаг для событий 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);

Попробуйте это здесь.

Ответ 4

Использование 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 */}
}

Ответ 5

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

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

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

Ответ 6

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

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