
Je uživatel online?
Jak zjistit, jestli je uživatel webové aplikace online nebo offline.
Díky tomu, že se webová stránka po načtení stáhne do prohlížeče návštěvníka, může následně fungovat i bez připojení k internetu (dokud nedojde k interakci vyžadující připojení).
Při použití lokálního úložiště a obsluhy stránky JavaScriptem nebo při použití Service Workeru jde potom obsahový web klidně celý stáhnout, aby fungoval i offline.
U webových stránek a aplikací, které mají lidé spuštěné delší dobu a je možné, že během jejich používání vypadne připojení, se nabízí výpadek návštěvníkovi oznámit.
Proč detekovat offline stav
Znázornit, že je problém s přípojením, je dobré z několika důvodů:
V případě nedostupného připojení uživatel nic netuše klikne na nějaký odkaz, čímž mu zmizí aktuální obsah a zobrazí se mu chybová stránka prohlížeče:

-
Je-li výpadek kvůli přetížení na straně serveru a ne u klienta, na chybové stránce bude klávesou F5 neustále obnovovat stránku a dále server vytěžovat.
Pokud by na stránce bylo šetrné upozornění, mohl by si návštěvník alespoň dočíst, co už je načteno.
Jednoduchým skriptem jde potom znázorňovat pokus o navázání spojení. Ať už skutečně nebo takovou ilusi alespoň vytvářet, aby návštěvník neměl důvod bušit do F5.
Na problémy s připojením upozorňuje například Chat na Facebooku, který zobrazuje odpočítávání do dalšího pokusu o připojení:

Řešení v JavaScriptu
V JavaScriptu existuje vlastnost onLine objektu navigator:
if (navigator.onLine) {
// online
}
else {
// offline
}
Zdá se být značně nespolehlivou, navíc se liší její chování napříč prohlížeči. Internet Explorer 8+ a Firefox 40 a starší se tváří jako offline jen při zapnutí Offline režimu v prohlížeči.
Samostatná ukázka použití navigator.onLine.
AJAX
Mnohem spolehlivější je použít AJAX. Při spuštění AJAXové akce potom zároveň spouštět časovač, který ji po neúnosně dlouhé době ukončí. Úspěšné dokončení tento časovač naopak zruší.
var casovac;
function ajax(url, callback) {
var xhr = new XMLHttpRequest();
var casovac = setTimeout(function() {
// Požadavek se nestihl provést v limitu 10 vteřin
xhr.abort();
}, 10 * 1000);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
// Požadvak dopadl OK, zruší se časovač
clearTimeout(casovac);
callback(xhr.responseText);
}
};
xhr.open('GET', url);
xhr.send();
}
Při nesplnění limitu potom stačí zobrazit hlášku, že je problém s přípojením.
Použít časovač pro kontrolu průběhu AJAXu je dobré i pro znázornění načítání, aby uživatel věděl, že se něco děje:
Odkazy jinam
- MDN: NavigatorOnLine.onLine
- HTML5 Rocks: Working Off the Grid with HTML5 Offline
Co si myslíte o tomto článku?
Diskuse
Související články
IndexedDB – klientská database v prohlížeči
IndexedDB je nízkoúrovňové API pro ukládání velkého množství strukturovaných dat na straně klienta, včetně souborů a blobů.
Service Worker – offline web, push notifikace a cache
Service Worker je skript běžící na pozadí prohlížeče, který umožňuje offline režim, push notifikace a pokročilé cachování webových stránek.
Offline stránka v PWA přes ServiceWorker
Jak udělat web fungující offline. A splnit tak požadavky na PWA.
Stažení dynamického webu
Jak stáhnout celou webovou stránku a převést ji do statické HTML podoby.