Wie erkenne ich, dass die Internetverbindung in JavaScript offline ist?
javascript
ajax
offline
connectivity
internet-connection
Daniel Silveira
quelle
quelle
Antworten:
Sie können feststellen, dass die Verbindung unterbrochen wird, indem Sie fehlgeschlagene XHR-Anforderungen stellen .
Der Standardansatz besteht darin, die Anforderung einige Male zu wiederholen . Wenn dies nicht der Fall ist, benachrichtigen Sie den Benutzer , um die Verbindung zu überprüfen, und schlagen Sie ordnungsgemäß fehl .
Nebenbemerkung: Wenn Sie die gesamte Anwendung in den "Offline" -Zustand versetzen, kann dies zu einer Menge fehleranfälliger Bearbeitungszustände führen. Drahtlose Verbindungen können kommen und gehen usw. Daher ist es möglicherweise am besten, wenn Sie nur ordnungsgemäß ausfallen und die Daten und alarmieren Sie den Benutzer. So können Sie das Verbindungsproblem, falls vorhanden, eventuell beheben und Ihre App mit einigem Maß an Vergebung weiter verwenden.
Nebenbemerkung: Sie könnten eine zuverlässige Website wie Google auf Konnektivität überprüfen. Dies ist jedoch möglicherweise nicht ganz nützlich, da Sie nur versuchen, eine eigene Anfrage zu stellen, da Google möglicherweise verfügbar ist, Ihre eigene Anwendung jedoch möglicherweise nicht verfügbar ist und Sie dies immer noch tun müssen Ihr eigenes Verbindungsproblem behandeln. Der Versuch, einen Ping an Google zu senden, ist eine gute Möglichkeit, um zu bestätigen, dass die Internetverbindung selbst unterbrochen ist. Wenn diese Informationen für Sie nützlich sind, lohnt sich möglicherweise die Mühe.
Nebenbemerkung : Das Senden eines Pings kann auf die gleiche Weise erfolgen, wie Sie eine bidirektionale Ajax -Anfrage stellen würden. Das Senden eines Pings an Google in diesem Fall wäre jedoch in diesem Fall mit einigen Herausforderungen verbunden. Erstens hätten wir dieselben domänenübergreifenden Probleme, die normalerweise bei der Ajax-Kommunikation auftreten. Eine Möglichkeit besteht darin, einen serverseitigen Proxy einzurichten, bei dem wir tatsächlich
ping
googeln (oder auf einer anderen Website) und die Ergebnisse des Pings an die App zurückgeben. Das ist ein Catch-22Denn wenn die Internetverbindung tatsächlich das Problem ist, können wir nicht zum Server gelangen, und wenn das Verbindungsproblem nur auf unserer eigenen Domain liegt, können wir den Unterschied nicht erkennen. Es könnten auch andere domänenübergreifende Techniken ausprobiert werden, z. B. das Einbetten eines Iframes in Ihre Seite, die auf google.com verweist, und das anschließende Abfragen des Iframes auf Erfolg / Misserfolg (Überprüfen des Inhalts usw.). Das Einbetten eines Bildes sagt uns möglicherweise nichts, da wir eine nützliche Antwort des Kommunikationsmechanismus benötigen, um eine gute Schlussfolgerung darüber zu ziehen, was vor sich geht. Daher kann es schwieriger sein, den Status der Internetverbindung als Ganzes zu bestimmen, als es wert ist. Sie müssen diese Optionen für Ihre spezifische App abwägen.quelle
IE 8 unterstützt die Eigenschaft window.navigator.onLine .
Aber das hilft natürlich nicht bei anderen Browsern oder Betriebssystemen. Ich gehe davon aus, dass andere Browser-Anbieter diese Eigenschaft ebenfalls bereitstellen werden, da es wichtig ist, den Online- / Offline-Status in Ajax-Anwendungen zu kennen.
Bis dies passiert, kann entweder XHR oder eine
Image()
oder<img>
Anfrage etwas bereitstellen, das der gewünschten Funktionalität nahe kommt.Update (16.11.2014)
Die gängigen Browser unterstützen diese Eigenschaft jetzt, aber Ihre Ergebnisse variieren.
Zitat aus der Mozilla-Dokumentation :
quelle
Fast alle gängigen Browser unterstützen jetzt die
window.navigator.onLine
Eigenschaft sowie die entsprechendenonline
undoffline
Fensterereignisse:Versuchen Sie, Ihr System oder Ihren Browser in den Offline- / Online-Modus zu versetzen, und überprüfen Sie die Konsole oder die
window.navigator.onLine
Eigenschaft auf Wertänderungen. Sie können es auch auf dieser Website testen .Beachten Sie jedoch dieses Zitat aus Mozilla-Dokumentation :
(Betonung ist meine eigene)
Dies bedeutet, dass wenn
window.navigator.onLine
istfalse
(oder Sie erhalten eineoffline
Veranstaltung erhalten), garantiert keine Internetverbindung haben.Wenn es
true
aber ist (oder du bekommst eineonline
Fall Ereignis erhalten), bedeutet dies nur, dass das System bestenfalls mit einem Netzwerk verbunden ist. Dies bedeutet nicht, dass Sie beispielsweise über einen Internetzugang verfügen. Um dies zu überprüfen, müssen Sie weiterhin eine der in den anderen Antworten beschriebenen Lösungen verwenden.Ich hatte ursprünglich vor, dies als Update für Grant Wagners Antwort zu veröffentlichen , aber es schien zu viel Bearbeitung zu sein, insbesondere angesichts der Tatsache, dass das Update 2014 bereits nicht von ihm stammte .
quelle
Es gibt verschiedene Möglichkeiten, dies zu tun:
Sie könnten eine
onerror
in eineimg
, wie setzenDiese Methode kann auch fehlschlagen, wenn das Quellbild verschoben / umbenannt wird, und ist im Allgemeinen der Ajax-Option unterlegen.
Es gibt also verschiedene Möglichkeiten, dies zu erkennen, keine ist perfekt, aber da es nicht möglich ist, aus der Browser-Sandbox zu springen und direkt auf den Netzverbindungsstatus des Benutzers zuzugreifen, scheinen sie die besten Optionen zu sein.
quelle
quelle
Die HTML5-Anwendungscache-API gibt navigator.onLine an, die derzeit in den IE8-Betas, WebKit-Nightlies (z. B. Safari) verfügbar ist und bereits in Firefox 3 unterstützt wird
quelle
Sie können mit $ Schnipsel () ‚s
error
Rückruf, das Feuer , wenn die Anforderung fehlschlägt. Wenn diestextStatus
der Zeichenfolge "timeout" entspricht, bedeutet dies wahrscheinlich, dass die Verbindung unterbrochen ist:Aus dem Dokument :
Also zum Beispiel:
quelle
Wie olliej sagte, ist die Verwendung der
navigator.onLine
Browsereigenschaft dem Senden von Netzwerkanforderungen vorzuziehen und wird dementsprechend mit developer.mozilla.org/En/Online_and_offline_events sogar von alten Versionen von Firefox und IE unterstützt.Vor kurzem hat die WHATWG das Hinzufügen der
online
und -Ereignisse festgelegtoffline
, falls Sie aufnavigator.onLine
Änderungen reagieren müssen .Bitte beachten Sie auch den von Daniel Silveira geposteten Link, der darauf hinweist, dass es nicht immer eine gute Idee ist, sich bei der Synchronisierung mit dem Server auf dieses Signal / diese Eigenschaft zu verlassen.
quelle
Ich musste eine Web-App (Ajax-basiert) für einen Kunden erstellen, der viel mit Schulen arbeitet. Diese Schulen haben oft eine schlechte Internetverbindung. Ich benutze diese einfache Funktion, um festzustellen, ob eine Verbindung besteht. Funktioniert sehr gut!
Ich benutze CodeIgniter und Jquery:
quelle
ist das, wonach Sie suchen, aber einige Dinge, die Sie hier hinzufügen müssen, zuerst, wenn es sich um etwas in Ihrer App handelt, das Sie ständig überprüfen möchten (z. B. um zu sehen, ob der Benutzer plötzlich offline geht, was in diesem Fall die meiste Zeit korrigiert, dann Sie müssen auch auf Änderungen hören), damit Sie dem Fenster einen Ereignis-Listener hinzufügen, um Änderungen zu erkennen. Um zu überprüfen, ob der Benutzer offline geht, können Sie Folgendes tun:
und um zu überprüfen, ob online:
quelle
onLine
. Browser definieren den Zustand, online zu sein, sehr unterschiedlich. Schauen Sie sich developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine an .Ein Ajax-Aufruf Ihrer Domain ist der einfachste Weg, um festzustellen, ob Sie offline sind
Dies ist nur, um Ihnen das Konzept zu geben, es sollte verbessert werden.
ZB Fehler = 404 sollte immer noch bedeuten, dass Sie online sind
quelle
Ich denke, das ist ein sehr einfacher Weg.
quelle
if the browser is not able to connect to a local area network (LAN) or a router, it is offline; all other conditions return true
Ich suchte nach einer clientseitigen Lösung, um festzustellen, ob das Internet oder mein Server ausgefallen war. Die anderen Lösungen, die ich gefunden habe, schienen immer von einer Skriptdatei oder einem Bild eines Drittanbieters abhängig zu sein, was für mich nicht so aussah, als würde es den Test der Zeit bestehen. Ein extern gehostetes Skript oder Image kann sich in Zukunft ändern und dazu führen, dass der Erkennungscode fehlschlägt.
Ich habe einen Weg gefunden, dies zu erkennen, indem ich nach einem xhrStatus mit einem 404-Code gesucht habe. Außerdem verwende ich JSONP, um die CORS-Einschränkung zu umgehen. Ein anderer Statuscode als 404 zeigt an, dass die Internetverbindung nicht funktioniert.
quelle
Meine Art.
quelle
Das Problem einiger Methoden wie
navigator.onLine
ist, dass sie nicht mit einigen Browsern und mobilen Versionen kompatibel sind. Eine Option, die mir sehr geholfen hat, war die Verwendung der klassischenXMLHttpRequest
Methode und auch die Möglichkeit, dass die Datei im Cache gespeichert wurde und die AntwortXMLHttpRequest.status
größer ist als 200 und weniger als 304.Hier ist mein Code:
quelle
Es gibt zwei Antworten für zwei verschiedene Szenarien: -
Wenn Sie JavaScript auf einer Website (dh einem Front-End-Teil) verwenden, ist dies am einfachsten:
Wenn Sie jedoch js auf der Serverseite verwenden (z. B. Knoten usw.), können Sie feststellen, dass die Verbindung unterbrochen wird, indem Sie fehlgeschlagene XHR-Anforderungen stellen.
Der Standardansatz besteht darin, die Anforderung einige Male zu wiederholen. Wenn dies nicht der Fall ist, benachrichtigen Sie den Benutzer, um die Verbindung zu überprüfen, und schlagen Sie ordnungsgemäß fehl.
quelle
Anforderungskopf im Anforderungsfehler
quelle
Hier ist ein Ausschnitt eines Hilfsprogramms, das ich habe. Dies ist Javascript mit Namespace:
Sie sollten dies mit der Methodenerkennung verwenden, da sonst eine alternative Methode ausgelöst wird. Die Zeit rückt immer näher, wenn dies alles ist, was benötigt wird. Die anderen Methoden sind Hacks.
quelle