2009-07-31 7 views
8

Ho un timer javascript che sta effettuando richieste XMLHTTP su base costante (una volta ogni 10 secondi). Mi piacerebbe essere in grado di mettere in pausa il timer quando la finestra o la scheda perde il focus.Esiste un modo affidabile per determinare se una scheda o una finestra del browser è inattiva o non a fuoco?

Sono pienamente consapevole delle onFocus e onBlur eventi sull'oggetto window, ma non vengono attivati ​​in modo affidabile in tutti i browser. Ad esempio, in Safari, tabs don't trigger the events.

semplice codice sotto distilla la funzionalità che sto cercando:

<html> 
    <head> 
    <title>Testing</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script> 
    </head> 
    <body> 
    <div id="console"></div> 
    <script type="text/javascript"> 
     window.onfocus = function(event) { 
     $('console').insert('Window gained focus<br />'); 
     } 

     window.onblur = function(event) { 
     $('console').insert('Window lost focus<br />'); 
     } 
    </script> 
    </body> 
</html> 

Qualcuno là fuori ha una tecnica per determinare quando una finestra o scheda del browser perde/Proventi attenzione che funziona su tutti i browser popolari?

+0

nella mia esperienza, questo non è risolvibile tramite flash. http://stackoverflow.com/questions/1099063/detecting-embedded-object-focus-in-safari – jedierikb

+0

possibile duplicato di [C'è un modo per rilevare se una finestra del browser non è attualmente attiva?] (http: // StackOverflow .com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-is-not-currently-active) – rvighne

risposta

3

Il codice sopra riportato funziona perfettamente in Safari v3.0.4 (WebKit 530+), il bug è stato risolto sembra. L'ho verificato in Google Chrome v3.0.195.27 e ha lo stesso bug di Safari, sebbene abbia una versione più recente di WebKit.

+0

Sei corretto che le versioni recenti di Safari lo gestiscano e Chrome no. Devo solo dire che per i miei scopi, il supporto di 3 dei primi 4 non è poi così male. –

+0

Chrome v3.0.195.38 si comporta in modo strano. Spara gli eventi su interruttore a schede ma solo quando si verifica almeno un cambio di finestra. – detj

0

I miei precedenti disperati tentativi di trovare una cosa del genere mi hanno portato a concludere che non esiste un animale del genere.

Oh, come mi piacerebbe essere sbagliato.

2

C'è un'altra domanda Stack Overflow per quanto riguarda questo argomento. Non hanno affrontato il problema di navigazione a schede lì. Forniscono un collegamento che va in qualche dettaglio, anche se senza usare jquery.

Is there a way to detect if a browser window is not currently active?

non credo manifestazioni Focus/sfocatura lavorano con navigazione a schede in Safari a tutti. Alcune persone hanno suggerito eventi del mouse, come mouseleave/mouseenter per questo.

Ho alcuni problemi di interfaccia utente come questo, quindi se scopro qualcosa seguirò qui.

-1

Una cosa da considerare è che schedafocus/blur eventi bloccati da produttori di browser è forse un modo per proteggere gli utenti. Alcuni browser consentono i popup di stile alert() (e persino, credo, un metodo focus()) per fare in modo che una scheda riacquisisca lo stato attivo. Il blocco degli eventi focus/blur per il cambio di scheda potrebbe essere simile alla protezione, ad esempio, da popup non richiesti e ridimensionamento/posizionamento/chiusura delle finestre.

+0

Significa ascoltare quegli eventi, non licenziandoli da solo. – aehlke

0
<script> 

    // Adapted slightly from Sam Dutton 
    // Set name of hidden property and visibility change event 
    // since some browsers only offer vendor-prefixed support 
    var hidden, state, visibilityChange; 
    if (typeof document.hidden !== "undefined") { 
     hidden = "hidden"; 
     visibilityChange = "visibilitychange"; 
     state = "visibilityState"; 
    } else if (typeof document.mozHidden !== "undefined") { 
     hidden = "mozHidden"; 
     visibilityChange = "mozvisibilitychange"; 
     state = "mozVisibilityState"; 
    } else if (typeof document.msHidden !== "undefined") { 
     hidden = "msHidden"; 
     visibilityChange = "msvisibilitychange"; 
     state = "msVisibilityState"; 
    } else if (typeof document.webkitHidden !== "undefined") { 
     hidden = "webkitHidden"; 
     visibilityChange = "webkitvisibilitychange"; 
     state = "webkitVisibilityState"; 
    } 

    // Add a listener that constantly changes the title 
    document.addEventListener(visibilityChange, function() { 
     document.title = document[state]; 
    }, false); 

    // Set the initial value 
    document.title = document[state]; 

</script> 
+2

È bello fornire un codice che possa aiutare a risolvere un problema. Ma in questo sito ci aspettiamo che le risposte spieghino il perché e il come. Si prega di aggiungere alcune precisioni al tuo post. –

Problemi correlati