2011-11-22 10 views
7

Tytuł wyjaśnia sam. Jak wykryć, czy strona internetowa przeszła w tło?Jak można wykryć, czy strona jest w tle lub na pierwszym planie z jquery/javascript?

Wdrażam aplikację do czatu, a wykorzystam te informacje, aby zdecydować o wyświetlaniu nowych powiadomień o wiadomościach. Przypuszczam, że Gmail używa czegoś takiego. Jeśli strona jest w tle, pokazuje powiadomienia na pulpicie (w chrome), jeśli nie, nie pokazuje ich.

+0

chodziło Ci o: * Jeśli okienko czat jest otwarty * ? –

+0

Załóżmy, że używasz Gmaila, czytasz e-maile itp. Otrzymałeś wiadomość, w tym przypadku Gmail nie pokazuje żadnego powiadomienia na pulpicie (ponieważ strona jest na pierwszym planie), ale jeśli przeglądasz inne witryny, gdy Gmail jest nadal wyświetlany otwarte, jesteś ostrzegany przez powiadomienie na pulpicie. Jak Gmail rozpoznaje swój status? –

Odpowiedz

10

Wiem, że odpowiedź została już wybrana, ale chciałem podzielić się innym sposobem.

Możesz użyć metody hasFocus na document, aby sprawdzić, czy ma fokus. Nie ma powodu, aby ustawiać własną zmienną.

Oto kilka dowodów kodu koncepcyjnego. jsFiddle znajduje się na samym dole. Co 3 sekundy sprawdza, czy okno ma fokus lub nie, wyświetlając wartość true lub false.

HTML:

<p>This will show if the document has focus every three seconds</p> 
<button id="go">Go</button> 
<button id="stop">Stop</button> 

<ul id="active_log"> 
</ul> 

CSS:

#stop { display: none; } 

JavaScript wewnątrz na dokumencie gotowe:

var timeout = null; 

var checkActive = function() { 
    var isActive = window.document.hasFocus(), 
     $activity = $("<li />").text(isActive.toString()); 

    $('#active_log').prepend($activity).find('li:nth-child(n+6)').fadeOut(function() { 
     $(this).remove(); 
    }); 

    timeout = setTimeout(checkActive, 3000); 
} 

$('#go').click(function() { 
    $(this).hide().siblings('button').show(); 
    checkActive(); 
}); 

$('#stop').click(function() { 
    $(this).hide().siblings('button').show(); 
    clearTimeout(timeout); 
    timeout = null; 
}); 

http://jsfiddle.net/natedavisolds/2D7za/1/

+0

Użyję window.document.hasFocus(), aby zdecydować o wyświetleniu powiadomienia. Dzięki za inspirujące! –

+0

Doskonała wskazówka! Jedno zastrzeżenie, o którym należy pamiętać, to tylko sprawdza, czy * dokument * ma fokus - wydaje się oczywisty, ale zwraca 'fałsz', jeśli inna ramka na stronie ma fokus (testowalny w jsFiddle) lub jeśli pasek adresu ma skupiać. –

+0

To na pewno będzie bardziej przydatne podejście oparte na różnych przeglądarkach przynajmniej na razie ... Warto zauważyć, że to podejście może zwrócić fałszywe negatywy (jeśli strona korzysta z wielu ramek lub użytkownik ustawia fokus poza dokumentem lub całkowicie wyłączone z przeglądarki, bez ukrywania strony), ale eksperymentalny interfejs Google'a działa odwrotnie, dając fałszywe alarmy dla kart pierwszego planu, które są całkowicie ukryte przez inne okna. Najlepsze podejście do użytkowania może również zależeć od tego, czy fałszywe alarmy lub negatywy będą bardziej niepokojące. –

4

Można powiązać ze zdarzeniami window z blur i focus. Oto fragment kodu z an app I wrote:

$(window).bind("blur", function() { 
    Chatterbox.set_focused(false); 
}); 

$(window).bind("focus", function() { 
    Chatterbox.set_focused(true); 
}); 
7

Jest teraz page visibility API za to, i to jest dobrze obsługiwany przez wszystkie najnowsze wersje głównych przeglądarek na Windows, Mac OS X i Linuksa (chociaż mam w rzeczywistości nie przetestowano wszystkich przeglądarek z uczciwym udziałem w rynku przeglądarki Linux).

Interfejs API widoczności strony jest teraz najlepszym sposobem sprawdzania widoczności; jedynymi zastrzeżeniami są to, że nie można powiedzieć, które części okna przeglądarki są widoczne (tylko to, że nic nie jest widoczne lub przynajmniej część z nich jest), a ta obsługa jest obecna tylko od 2016 roku w systemie Linux, 2015 na komputerze Mac i 2014 (prawdopodobnie wcześniej) w systemie Windows.

Podczas wdrażania wsparcia fałszywy negatyw był rzadki, ale na niektórych platformach wystąpiły fałszywe alarmy; na przykład w 2014 r. OSX wyświetlał miniaturowe wersje zminimalizowanych aplikacji w stacji dokującej, a w wyniku sposobu, w jaki zostało to zrobione, aplikacja nie mogła łatwo stwierdzić, czy została ona zminimalizowana, ponieważ wciąż wymagano od malowania ekranu. Linux miał komplikacje wiedząc, czy twoja aplikacja znajdowała się w niewidocznym obszarze roboczym i czy inne okno go blokowało.

Pierwszy publiczny projekt został opublikowany w czerwcu 2011 r., A status "rekomendacji" osiągnął w maju 2013 r. Do marca 2014 r. Najnowsze wersje wszystkich głównych przeglądarek Windows miały pełną obsługę standardu. Pełna obsługa wszystkich głównych przeglądarek Maca została osiągnięta w kwietniu 2015 roku. Wsparcie dla systemu Linux osiągnięto przynajmniej dla Chromium do sierpnia 2016 roku (kiedy zamknięto Chromium issue 293128); chociaż ich nie testowałem, spodziewam się, że inne przeglądarki linuksowe prawdopodobnie dotrzymały kroku, ponieważ najtrudniejsza część pracy wydaje się dostosowywać system operacyjny/graficzny do zawierania umów i interfejsów API, aby wiedzieć, czy twoja aplikacja jest widoczna.

+0

Bardzo interesujące, szczególnie będąc w stanie wykryć stan "prerender", który ugryzł mnie przed ... –

+0

Nie znałem takiego API, dziękuję. Wydaje się jednak, że nie jest tak logiczne używanie w produkcji takiego eksperymentalnego API. –

+1

Aby uratować wszystkich kilka kliknięć: http://caniuse.com/#feat=pagevisibility –

Powiązane problemy