2010-04-27 8 views
56

Ich muss wissen, ob der Benutzer gerade einen Tab in Google Chrome anzeigt oder nicht. Ich habe versucht, die Ereignisse zu verwischen und den Fokus auf das Fenster zu fokussieren, aber nur die Unschärfe scheint korrekt zu funktionieren.Wie erkennt man, ob ein Tab in Chrome mit Javascript aktiviert ist oder nicht?

window.addEventListener('focus', function() { 
    document.title = 'focused'; 
}); 

window.addEventListener('blur', function() { 
    document.title = 'not focused'; 
}); 

Das Fokusereignis funktioniert seltsam, nur manchmal. Wenn ich zu einer anderen Registerkarte und zurück wechsle, wird das Fokusereignis nicht aktiviert. Aber wenn ich auf die Adressleiste und dann auf die Seite klicke, wird es. Oder wenn ich zu einem anderen Programm und dann zurück zu Chrome wechsle, wird es aktiviert, wenn der Tab gerade fokussiert ist.

+0

Haben Sie versucht, diese Ereignisse anhängen zu 'docment' statt' window'? – Crozin

+0

Ich bin mir nicht sicher, ob dies die Ereigniserkennung betrifft, aber die 'window.focus'-Aktion ist in Chrome deaktiviert (oder zumindest fehlerhaft). Siehe [hier] (http://code.google.com/p/chromium/issues/detail?id=1674) und [hier] (http://stackoverflow.com/questions/2703314/in-google-chrome- how-do-i-bring-ein-existing-popup-window-to-the-front-using-java) für mehr. – brahn

+0

Funktioniert auch nicht mit dem Dokument und dies ist für das Fokusereignis und nicht für die Fokusaktion. Ich denke, ich werde meinen Ansatz ändern und das Ereignis entweder auf Mouseover oder Fenster scrollen ändern. Für dieses Szenario ist es angemessen. – fent

Antwort

96

2015 Update: Der neue HTML5 Weg mit Sichtbarkeit API (von Blowsie Kommentar genommen):

document.addEventListener('visibilitychange', function(){ 
    document.title = document.hidden; // change tab text for demo 
}) 

Der Code das ursprüngliche Plakat (in der Frage) gibt funktioniert nun, ab 2011 :

window.addEventListener('focus', function() { 
    document.title = 'focused'; 
}); 

window.addEventListener('blur', function() { 
    document.title = 'not focused'; 
}); 

bearbeiten: Ab ein paar Monate später in Chrome 14, das noch funktioniert, aber die Der Benutzer muss mit der Seite interagiert haben, indem er mindestens einmal in das Fenster geklickt hat. Scrollen einfach und so ist nicht genug, um diese Arbeit zu machen. Doing window.focus() macht dies auch nicht automatisch funktionieren. Wenn jemand einen Workaround kennt, bitte erwähnen.

+0

Sie haben Recht, es tut. – fent

+15

Woohoo, Nekromanten-Abzeichen! – ninjagecko

+1

Der Weg, dies zum Laufen zu bringen, ohne dass der Benutzer zuerst irgendwo klicken muss, ist "window.focus()" zum window.onload-Ereignis hinzuzufügen. Der Nebeneffekt davon ist, dass, wenn das Fenster das Ziel eines Links ist und bereits hinter dem aktuellen Fenster geöffnet war, es in den Vordergrund gebracht wird. Beachten Sie, dass diese Lösung nur den Fokusverlust erkennt, nicht dass es durch das Wechseln der Tabs verursacht wurde. Wenn der Fokusverlust zum Beispiel darauf zurückzuführen ist, dass der Benutzer in einen Iframe klickt, müssen Sie Folgendes eliminieren: –

2

Es könnte schließlich arbeiten, ich wurde neugierig und schrieb diesen Code:

... 
setInterval (updateSize, 500); 
function updateSize(){ 
    if(window.outerHeight == window.innerHeight){ 
    document.title = 'not focused';    
    } else { 
    document.title = 'focused'; 
    } 

    document.getElementById("arthur").innerHTML = window.outerHeight + " - " + window.innerHeight; 
} 
... 
<div id="arthur"> 
    dent 
</div> 

Dieser Code funktioniert precisly, was Sie wollen, aber auf eine hässliche Art und Weise. Die Sache ist, Chrome scheint den Titelwechsel von Zeit zu Zeit zu ignorieren (wenn man auf den Tab wechselt und die Maus für 1 Sekunde gedrückt hält, scheint dieser Effekt immer zu kreieren).

Sie erhalten unterschiedliche Werte auf Ihrem Bildschirm, aber Ihr Titel ändert sich nicht.

schlussfolgerung: Was auch immer Sie tun, trauen Sie nicht das Ergebnis beim Testen!

+0

Der Titel ändert sich sofort für mich. Wenn ich die Ereignisse in mouseover und mouseout ändere, bekomme ich sofort Ergebnisse. – fent

+0

Wie auch immer, danke für den Teil (window.outerHeight == window.innerHeight). Für dieses spezielle Projekt muss ich nur wissen, ob der Benutzer gerade fokussiert ist oder nicht. Keine Notwendigkeit, ständig zu überprüfen, und Ihr Code funktioniert. – fent

+1

Das funktioniert nicht mehr, ab 2011. – ninjagecko

0

Ich fand, dass onblur Hinzufügen = und onfocus = event das Problem umgangen inline:

-2

In Chrom Sie können mit einem Timeout von weniger als 1 Sekunde einen Hintergrund Skript ausführen, und wenn die Registerkarte hat keinen Fokus Chrome wird es nur jede Sekunde ausführen. Beispiel;

Dies funktioniert nicht in Firefox oder Opera. Ich weiß nicht, über andere Browser, aber ich bezweifle, dass es auch dort funktioniert.

var currentDate = new Date(); 
var a = currentDate.getTime(); 

function test() { 
    var currentDate = new Date(); 
    var b = currentDate.getTime(); 
var c = b - a; 
    if (c > 900) { 
     //Tab does not have focus. 
    } else { 
     //It does 
    } 
    a = b; 
    setTimeout("test()",800); 
} 



setTimeout("test()",1); 
+2

Ich mag die Idee nicht, Intervalle für etwas zu verwenden, das ausgeglichen werden sollte. Und beachten Sie, dass Sie 'setTimeout (test, 800)' verwenden sollten. Wenn Sie ihm einen String geben, wird es 'eval()' es, was viel viel langsamer ist. – fent

0

mit JQuery arbeiten

$(function() { 
    $(window).focus(function() { 
     console.log('Focus'); 
    }); 

    $(window).blur(function() { 
     console.log('Blur'); 
    }); 
}); 
+0

Ich denke, das wird nicht helfen, weil, wie er berichtet, Browser keine Ereignisfunktion feuert, die Sie in 'Unschärfe' angehängt haben. Wie in Ihrem Beispiel und dem Code 'console.log ('Blur');' wird in einigen Situationen NICHT aufgerufen. – psulek

1

Für alle, die Seitentitel auf Blur tauschen will und dann auf den ursprünglichen Seitentitel auf Fokus zurück:

// Swapping page titles on blur 
var originalPageTitle = document.title; 

window.addEventListener('blur', function(){ 
    document.title = 'Don\'t forget to read this...'; 
}); 

window.addEventListener('focus', function(){ 
    document.title = originalPageTitle; 
}); 
Verwandte Themen