DEV Community

Cover image for Detecting if the user is online with JavaScript

Detecting if the user is online with JavaScript

Chris Bongers on December 01, 2022

Sometimes you might want to enhance your application to notify users they might have lost their internet connection. Users might be visiting your ...
Collapse
 
artydev profile image
artydev • Edited

Great Chris as usual :-)

A detail, instead of

  <div class="offline-msg">You're offline 😢</div>
  <div class="online-msg">You're connected 🔗</div>
Enter fullscreen mode Exit fullscreen mode

Why not

   <div class="msg" data-status="offline">You're offline 😢</div>
   <div class="msg" data-status="online">You're connected 🔗</div>
Enter fullscreen mode Exit fullscreen mode

And in your CSS

.msg[data-status='offline'] {
  color: red
}

.msg[data-status='online'] {
  color: green
}
Enter fullscreen mode Exit fullscreen mode

Regards

Collapse
 
dailydevtips1 profile image
Chris Bongers

We could do that indeed, really depends on the setup, but yeah this is quite neat 🥳

Collapse
 
billernet profile image
Bill💡

@artydev I would go one step further and put the status value as a class on the root html node. That way any other online/offline dependent elements can be captured. After all, the status is an aspect of the document as a whole!

html.online .msg {
    color: green
}

html.offline .msg {
    color: red
}
Enter fullscreen mode Exit fullscreen mode

Elements that are only available when online could be given the class online-only.

html.offline .online-only {
    display:none;
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
artydev profile image
artydev

Thank you Bill, nice idea.
I have never thought to set a class on html tag...

Collapse
 
omril321 profile image
Omri Lavi

Hi Chris, thank you for this article! It was very interesting.
Keep in mind that relying on the browser alone may not be enough. In some scenarios the browser may falsly "think" it is connected, for example if connected to a network that has no connection to the internet. If the status is "offline" then there's no connection, but "online" does not necessarily mean a connection exists.

Collapse
 
dailydevtips1 profile image
Chris Bongers

Yeah correct, it's very rare you'll need this much detail.
In general for specific type of applications that would need this I think this will do, but if it highly depends on the status there are alternatives indeed.

Collapse
 
jozsef88 profile image
Jozsef88

In case anyone uses react, here's a solution:

`import React, { useState, useEffect } from 'react';
import './OnlineStatus.css';

export default function OnlineStatus() {
const [status, setStatus] = useState('offline');

useEffect(() => {
    const onlineCheck = setInterval(() => {
        if (navigator.onLine) {
            setStatus('online');
        } else {
            setStatus('offline');
        }
    }, 1000)
    return () => { clearInterval(onlineCheck) };
}, [])

return (
    <div className="status">
        <div style={status === "offline" ? { display: "block" } : { display: "none" }} className="offline-msg">Offline</div>
        <div style={status === "online" ? { display: "block" } : { display: "none" }} className="online-msg">Online</div>
    </div>
)
Enter fullscreen mode Exit fullscreen mode

}`

Collapse
 
arunbohra12 profile image
Arun Bohra

Hi Chirs, you can get true even when device can't access internet. Such as using software that use virtual ethernet adapters that are always "connected." Do you know something for that as well?

Collapse
 
dailydevtips1 profile image
Chris Bongers

That's very tricky, think only server side would be able to handle those events?
Like try to reach something (ping) and see if it actually responds?

Collapse
 
fruntend profile image
fruntend

Сongratulations 🥳! Your article hit the top posts for the week - dev.to/fruntend/top-10-posts-for-f...
Keep it up 👍

Collapse
 
dailydevtips1 profile image
Chris Bongers

Amazing! 🥳

Collapse
 
timhuang profile image
Timothy Huang

Very useful. Thank you.

Collapse
 
qq449245884 profile image
qq449245884

Dear Chris Bongers,may I translate your article into Chinese?I would like to share it with more developers in China. I will give the original author and original source.

Collapse
 
dailydevtips1 profile image
Chris Bongers

Sure thing, go for it 🙏

Collapse
 
premierdan profile image
premierdan

Amazing

Collapse
 
ewenikeemmanue4 profile image
Ewenike Chukwuemeka Emmanuel👨‍💻

This is nice..

Collapse
 
dailydevtips1 profile image
Chris Bongers

Thanks! glad you enjoyed it ❤️

Collapse
 
jhon1989 profile image
Jhon Janer Moreno Caceres • Edited

Thanks for sharing

Collapse
 
uploadcare profile image
Uploadcare

This API is too unstable and usually you don't want to use it in production, because online in terms of user's browser may not be the same as online in terms of the user themselves.

There are better ways to detect offline:

  1. Long-pooling request to the server.
  2. Periodical check for a dummy image/resource without caching.
  3. Showing such a status only when the user's request fails due to unstable network.

Relying on navigator.onLine only you may scare your user. So, please do not.

Collapse
 
bobbyiliev profile image
Bobby Iliev

Very cool!

Collapse
 
ssd profile image
server side digest

Great one. Kindly check it out too dev.to/lovepreetsingh/oops-write-s...

Collapse
 
artydev profile image
artydev • Edited

@lovepreetsingh

You could be interested by Learning JavaScript Design Patterns

from wellknown Addy Osmani

Regards

Collapse
 
ssd profile image
server side digest

Sure, I am going to check this one

Collapse
 
ijsucceed profile image
Jeremy Ikwuje

Hi Chris, thank you!

BTW, what design tool are you using for your featured image?