Ich habe JavaScript, das regelmäßig Aktivitäten ausführt. Wenn der Benutzer die Site nicht betrachtet (dh das Fenster oder die Registerkarte hat keinen Fokus), wäre es schön, nicht ausgeführt zu werden.
Gibt es eine Möglichkeit, dies mit JavaScript zu tun?
Mein Bezugspunkt: Google Mail Chat gibt einen Ton wieder, wenn das von Ihnen verwendete Fenster nicht aktiv ist.
javascript
browser
focus
window
Luke Francl
quelle
quelle
requestAnimationFrame
API oder verwenden Sie die moderne Funktion, mit der die Häufigkeit vonsetTimeout
/setInterval
verringert wird, wenn das Fenster nicht sichtbar ist (z. B. 1 Sekunde in Chrome).blur
/focus
in Browsern , die es nicht unterstützen.Antworten:
Seit dem ursprünglichen Schreiben dieser Antwort hat eine neue Spezifikation dank des W3C den Empfehlungsstatus erreicht. Mit der Page Visibility API (auf MDN ) können wir jetzt genauer erkennen, wann eine Seite für den Benutzer ausgeblendet ist.
Aktuelle Browserunterstützung:
Der folgende Code greift auf die weniger zuverlässige Unschärfe- / Fokusmethode in inkompatiblen Browsern zurück:
onfocusin
undonfocusout
sind für den Internet Explorer 9 und senken erforderlich , während alle anderen Gebrauch machen vononfocus
undonblur
, mit Ausnahme von iOS, welche Anwendungenonpageshow
undonpagehide
.quelle
focusin
undfocusout
vom Iframe zum oberen Fenster. Bei neueren Browsern müssten Sie nur diefocus
undblur
-Ereignisse für daswindow
Objekt jedes Iframes verarbeiten . Sie sollten den aktualisierten Code verwenden, den ich gerade hinzugefügt habe und der zumindest diese Fälle in neueren Browsern abdeckt.Ich würde jQuery verwenden, weil Sie dann nur noch Folgendes tun müssen:
Zumindest hat es bei mir funktioniert.
quelle
window
Fokus, was richtig ist, aber abhängig davon, was Ihre Absicht möglicherweise nicht das ist, was Sie brauchen.Es gibt drei typische Methoden, mit denen ermittelt wird, ob der Benutzer die HTML-Seite sehen kann. Keine davon funktioniert jedoch einwandfrei:
Die W3C Page Visibility API soll dies tun (unterstützt seit: Firefox 10, MSIE 10, Chrome 13). Diese API löst jedoch nur Ereignisse aus, wenn die Browser-Registerkarte vollständig überschrieben ist (z. B. wenn der Benutzer von einer Registerkarte zu einer anderen wechselt). Die API löst keine Ereignisse aus, wenn die Sichtbarkeit nicht mit 100% iger Genauigkeit bestimmt werden kann (z. B. Alt + Tab, um zu einer anderen Anwendung zu wechseln).
Die Verwendung von auf Fokus / Unschärfe basierenden Methoden führt zu vielen falsch positiven Ergebnissen. Wenn der Benutzer beispielsweise ein kleineres Fenster über dem Browserfenster anzeigt, verliert das Browserfenster den Fokus (
onblur
angehoben), der Benutzer kann ihn jedoch weiterhin sehen (daher muss er noch aktualisiert werden). Siehe auch http://javascript.info/tutorial/focusUm das oben beschriebene unvollständige Verhalten zu verbessern, verwende ich eine Kombination der drei Methoden: W3C-Sichtbarkeits-API, dann Fokus- / Unschärfe- und Benutzeraktivitätsmethoden, um die Falsch-Positiv-Rate zu reduzieren. Auf diese Weise können die folgenden Ereignisse verwaltet werden:
So funktioniert es: Wenn das Dokument den Fokus verliert, wird die Benutzeraktivität (z. B. Mausbewegung) des Dokuments überwacht, um festzustellen, ob das Fenster sichtbar ist oder nicht. Die Wahrscheinlichkeit der Seitensichtbarkeit ist umgekehrt proportional zum Zeitpunkt der letzten Benutzeraktivität auf der Seite: Wenn der Benutzer längere Zeit keine Aktivität im Dokument ausführt, ist die Seite höchstwahrscheinlich nicht sichtbar. Der folgende Code ahmt die W3C-Sichtbarkeits-API nach: Sie verhält sich genauso, weist jedoch eine geringe Falsch-Positiv-Rate auf. Es hat den Vorteil, Multibrowser zu sein (getestet auf Firefox 5, Firefox 10, MSIE 9, MSIE 7, Safari 5, Chrome 9).
Da es derzeit keine funktionierende browserübergreifende Lösung ohne falsches Positiv gibt, sollten Sie zweimal überlegen, ob Sie regelmäßige Aktivitäten auf Ihrer Website deaktivieren möchten.
quelle
Auf GitHub steht eine übersichtliche Bibliothek zur Verfügung:
https://github.com/serkanyersen/ifvisible.js
Beispiel:
Ich habe Version 1.0.1 in allen Browsern getestet und kann bestätigen, dass es funktioniert mit:
... und wahrscheinlich alle neueren Versionen.
Funktioniert nicht vollständig mit:
.now()
kehrt immertrue
für mich zurück)quelle
Verwenden von: Page Visibility API
Kann ich benutzen ? http://caniuse.com/#feat=pagevisibility
quelle
Ich erstelle einen Kometen-Chat für meine App und wenn ich eine Nachricht von einem anderen Benutzer erhalte, verwende ich:
quelle
document.hasFocus()
ist der sauberste Weg, es zu tun. Alle anderen Möglichkeiten, die Sichtbarkeits-API oder ereignisbasiert zu verwenden oder nach verschiedenen Ebenen der Benutzeraktivität / mangelnder Aktivität zu suchen, werden überkompliziert und voller Randfälle und Lücken. Legen Sie ein einfaches Intervall fest und lösen Sie ein benutzerdefiniertes Ereignis aus, wenn sich die Ergebnisse ändern. Beispiel: jsfiddle.net/59utucz6/1Ich habe zunächst die Antwort des Community-Wikis verwendet, aber festgestellt, dass in Chrome keine Alt-Tab-Ereignisse erkannt wurden. Dies liegt daran, dass die erste verfügbare Ereignisquelle verwendet wird. In diesem Fall handelt es sich um die API für die Sichtbarkeit von Seiten, die in Chrome anscheinend kein Alt-Tabbing erfasst.
Ich habe beschlossen, das Skript ein wenig zu ändern, um alle möglichen Ereignisse für Änderungen des Seitenfokus zu verfolgen . Hier ist eine Funktion, die Sie besuchen können:
Verwenden Sie es so:
Diese Version wartet auf alle verschiedenen Sichtbarkeitsereignisse und löst einen Rückruf aus, wenn eines davon eine Änderung verursacht. Die Handler
focused
undunfocused
stellen sicher, dass der Rückruf nicht mehrmals aufgerufen wird, wenn mehrere APIs dieselbe Sichtbarkeitsänderung erfassen.quelle
document.hidden
unddocument.webkitHidden
. Ohne dieelse
in derif
Konstruktion würden wir 2 Rückrufe bekommen, oder?Das ist wirklich schwierig. Angesichts der folgenden Anforderungen scheint es keine Lösung zu geben.
Dies geschieht, weil:
Angesichts dieser Einschränkungen ist es möglich, eine Lösung zu implementieren, die Folgendes kombiniert: - Die API für Seitensichtbarkeit - Fensterunschärfe / Fokus - document.activeElement
Das kann:
Wenn der Iframe den Fokus hat, werden Ihre Unschärfe- / Fokusereignisse überhaupt nicht aufgerufen, und die Seiten-Sichtbarkeits-API wird auf Alt + Tab nicht ausgelöst.
Ich habe auf der Lösung von @ AndyE aufgebaut und diese (fast gute) Lösung hier implementiert: https://dl.dropboxusercontent.com/u/2683925/estante-components/visibility_test1.html (Entschuldigung, ich hatte einige Probleme mit JSFiddle).
Dies ist auch auf Github verfügbar: https://github.com/qmagico/estante-components
Dies funktioniert auf Chrom / Chrom. Es funktioniert auf Firefox, außer dass es den Iframe-Inhalt nicht lädt (eine Idee warum?)
Um das letzte Problem (4) zu lösen, können Sie dies nur tun, indem Sie auf Unschärfe- / Fokusereignisse im Iframe achten. Wenn Sie die iframes steuern können, können Sie dazu die postMessage-API verwenden.
https://dl.dropboxusercontent.com/u/2683925/estante-components/visibility_test2.html
Ich habe dies immer noch nicht mit genügend Browsern getestet. Wenn Sie weitere Informationen darüber finden, wo dies nicht funktioniert, lassen Sie es mich bitte in den Kommentaren unten wissen.
quelle
http://jsfiddle.net/ARTsinn/JTxQY/
quelle
Das funktioniert bei mir auf Chrom 67, Firefox 67,
quelle
Sie können verwenden:
quelle
In HTML 5 können Sie auch Folgendes verwenden:
onpageshow
: Skript, das ausgeführt wird, wenn das Fenster sichtbar wirdonpagehide
: Skript, das ausgeführt werden soll, wenn das Fenster ausgeblendet istSehen:
quelle
Dies ist eine Anpassung der Antwort von Andy E.
Dadurch wird eine Aufgabe ausgeführt, z. B. die Seite alle 30 Sekunden aktualisiert, jedoch nur, wenn die Seite sichtbar und fokussiert ist.
Wenn keine Sichtbarkeit erkannt werden kann, wird nur der Fokus verwendet.
Wenn der Benutzer die Seite fokussiert, wird sie sofort aktualisiert
Die Seite wird erst 30 Sekunden nach einem Ajax-Aufruf erneut aktualisiert
quelle
Eine Lösung ohne jQuery finden Sie in Visibility.js, die Informationen zu drei Seitenzuständen enthält
und auch Convenience-Wrapper für setInterval
Ein Fallback für ältere Browser (IE <10; iOS <7) ist ebenfalls verfügbar
quelle
Eine etwas kompliziertere Methode wäre die
setInterval()
Überprüfung der Mausposition und der Vergleich mit der letzten Überprüfung. Wenn sich die Maus in einer festgelegten Zeit nicht bewegt hat, ist der Benutzer wahrscheinlich untätig.Dies hat den zusätzlichen Vorteil, dass Sie feststellen können, ob der Benutzer inaktiv ist, anstatt nur zu überprüfen, ob das Fenster nicht aktiv ist.Wie viele Leute darauf hingewiesen haben, ist dies nicht immer eine gute Möglichkeit, um zu überprüfen, ob das Benutzer- oder Browserfenster inaktiv ist, da der Benutzer möglicherweise nicht einmal die Maus verwendet oder ein Video oder ähnliches ansieht. Ich schlage nur einen möglichen Weg vor, um den Leerlauf zu überprüfen.
quelle
Für angular.js gibt es hier eine Anweisung (basierend auf der akzeptierten Antwort), die es Ihrem Controller ermöglicht, auf eine Änderung der Sichtbarkeit zu reagieren:
Sie können es wie in diesem Beispiel verwenden:
<div react-on-window-focus="refresh()">
Worefresh()
befindet sich eine Bereichsfunktion im Bereich des Controllers ?quelle
Hier ist eine solide, moderne Lösung. (Kurz ein süßes 👌🏽)
Dadurch wird ein Listener eingerichtet, der ausgelöst wird, wenn ein Sichtbarkeitsereignis ausgelöst wird, das ein Fokus oder eine Unschärfe sein kann.
quelle
Wenn Sie möchten , handeln , auf ganzen Browser blur : Wie ich bemerkte, wenn Browser verliert Fokus keines des Feuers vorgeschlagen Veranstaltungen. Meine Idee ist es, in einer Schleife hochzuzählen und den Zähler zurückzusetzen, wenn ein Ereignis ausgelöst wird. Wenn der Zähler ein Limit erreicht, mache ich einen location.href auf eine andere Seite. Dies wird auch ausgelöst, wenn Sie an Entwicklungswerkzeugen arbeiten.
Dies ist ein Entwurf, der erfolgreich auf FF getestet wurde.
quelle