Today I learnt something that I didn't know exist, so i'm actually really glad that you linked this project, it made me look for details on the spec/standard.
First of all, I looked through your code and couldn't understand how this was implemented. After I found it and researched, it's clear that it's essentially useless[1].
I'm not bashing on your project, I like it, but aside from being a cool gimmick, I can't think of any real world usages?
...Unless your application is LAN-based , offline-heavy, or your have pixies that run around your office pulling out your network cable regularly * chuckles *.
I'll explain, but please correct me if I am way off the mark.
The project connects to the network events
this.events = {
network: ['online', 'offline']
};
These events fire from observing the attribute
window.navigator.onLine
This attribute returns true, when the system is connected to a network, but returns false when it isn't.
The importance of this is that the attribute is inherently unreliable. A computer can be connected to a network without having Internet access. [2]
This is a barebones minimal example that doesn't have the features you added:
If you disconnect yourself from your network you will see the fiddle update to "Offline", however, if you pull your phone-line from your router, it will still stay at "Online".
[1] : It's inherently unreliable.
A computer can be connected to a network without internet access.
[2] : http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html
> A computer can be connected to a network without having Internet access.
In fact, as the Internet is essentially a network of networks some of which may be connected and disconnected at arbitrary points in time, it is a bit difficult to strictly define what it means to have Internet access.
In practice it would probably mean something like "can access a large majority of servers that consider themselves to be Internet servers", which is however impractical to test for. A "good enough" substitute is often enough to test connectivity to a few representative services which are unlikely to be unreachable all at the same time if you consider yourself to have "Internet access" (Google, Amazon, ...).
In this case it would however be best to test connectivity between the user and the specific server that the user is supposed to access.
An option would be to connect via websocket to a server and react on the disconnect event (doing some simple ping-pong to keep the connection alive). That would require an always-on websocket server though, which is a different story. Still could be good enough for a gimmick like this.
Completely wrong. If 98% of the time (or even 50-97%)(i.e., reality) being connected to a network means also being connected to the internet, then it is useful. And it is also does not throw false negatives.
> The navigator.onLine attribute must return false if the user agent will not contact the network when the user follows links or when a script requests a remote page (or knows that such an attempt would fail), and must return true otherwise.
So, strictly speaking, if you have a network connection and no internet connectivity (and the browser is not aware of the latter), this should return true - because clicking a link will result in the browser contacting the network.
What would be really interesting to see is how this works with various browsers in Windows, because Windows does test connections for internet connectivity.
> ...Unless your application is LAN-based , offline-heavy, or your have pixies that run around your office pulling our your network cable regularly * chuckles *.
add in wireless device on a network that doesn't cover all areas of the building where the application is used.
The issue with the OP's implementation and yours is that not all browsers implement navigator.onLine the same way.
For example, if you run the jSFiddle on Firefox, you would see that the status does not change even if you pull out the cable or turn off WiFi. This is because of how Firefox chooses to interpret the spec. However, if you enable offline mode in Firefox (File -> Work Offline), you can see that the status changes.
I smell a feature addition that polls for some virtually-always-online internet resource, such as google.com, to routinely distinguish between the various values of 'online'.
It may not be 100% reliable, but coupled with other techniques (catching error 404s etc) this provides a nice way to inform the user that their connection to our application may be gone.
For single page apps that use browser storage and sync to the remote periodically it is great to be able to inform the user that "Hey you're offline. You can keep using it, but your changes won't be available for others to see until you re-connect".
Aah, that explains why it didn't work for me (VM network cards were still active). Seems to me like setTimeout-based polling to your server or something like http://www.msftncsi.com/ncsi.txt is still the best option.
You might want a notification like this at the application level for the sake of consistency. For instance, Gmail's "Loading..." messages will also notify you when you have lost or gained a connection.
Surely consistent messaging and notifications is better for the user. Chrome has a desktop notifications API, but that's only appropriate for certain types of messages, such as receiving a new email. In general, it's probably best to handle messaging at the application level.
The FF window.navigator.onLine event fires when you click the "Work offline" option in the menu, at least I think it used to. Just tried that and it didn't work either.
I have been looking for a X-browser way to do this myself and the best I cam up with so far was to ping google.com with a XHR OPTIONS type request. Pretty ugly, but it works.
[+] [-] chrisacky|13 years ago|reply
First of all, I looked through your code and couldn't understand how this was implemented. After I found it and researched, it's clear that it's essentially useless[1].
I'm not bashing on your project, I like it, but aside from being a cool gimmick, I can't think of any real world usages?
...Unless your application is LAN-based , offline-heavy, or your have pixies that run around your office pulling out your network cable regularly * chuckles *.
I'll explain, but please correct me if I am way off the mark.
The project connects to the network events
These events fire from observing the attribute This attribute returns true, when the system is connected to a network, but returns false when it isn't.The importance of this is that the attribute is inherently unreliable. A computer can be connected to a network without having Internet access. [2]
This is a barebones minimal example that doesn't have the features you added:
You can see the fiddle here: http://jsfiddle.net/3rRWK/If you disconnect yourself from your network you will see the fiddle update to "Offline", however, if you pull your phone-line from your router, it will still stay at "Online".
[+] [-] anonymouz|13 years ago|reply
In fact, as the Internet is essentially a network of networks some of which may be connected and disconnected at arbitrary points in time, it is a bit difficult to strictly define what it means to have Internet access.
In practice it would probably mean something like "can access a large majority of servers that consider themselves to be Internet servers", which is however impractical to test for. A "good enough" substitute is often enough to test connectivity to a few representative services which are unlikely to be unreachable all at the same time if you consider yourself to have "Internet access" (Google, Amazon, ...).
In this case it would however be best to test connectivity between the user and the specific server that the user is supposed to access.
[+] [-] agranig|13 years ago|reply
[+] [-] pbreit|13 years ago|reply
Completely wrong. If 98% of the time (or even 50-97%)(i.e., reality) being connected to a network means also being connected to the internet, then it is useful. And it is also does not throw false negatives.
[+] [-] ZoFreX|13 years ago|reply
> The navigator.onLine attribute must return false if the user agent will not contact the network when the user follows links or when a script requests a remote page (or knows that such an attempt would fail), and must return true otherwise.
So, strictly speaking, if you have a network connection and no internet connectivity (and the browser is not aware of the latter), this should return true - because clicking a link will result in the browser contacting the network.
What would be really interesting to see is how this works with various browsers in Windows, because Windows does test connections for internet connectivity.
[+] [-] thisone|13 years ago|reply
add in wireless device on a network that doesn't cover all areas of the building where the application is used.
We've had to handle this situation.
[+] [-] sdqali|13 years ago|reply
This issue is described in greater detail here - http://schalk-neethling.com/2011/05/navigator-online-and-the...
[+] [-] skrebbel|13 years ago|reply
[+] [-] shimms|13 years ago|reply
For single page apps that use browser storage and sync to the remote periodically it is great to be able to inform the user that "Hey you're offline. You can keep using it, but your changes won't be available for others to see until you re-connect".
[+] [-] px1999|13 years ago|reply
[+] [-] philfreo|13 years ago|reply
[+] [-] jbrooksuk|13 years ago|reply
[+] [-] ubermensche|13 years ago|reply
[+] [-] frozenport|13 years ago|reply
[+] [-] bradp|13 years ago|reply
[+] [-] copypasteweb|13 years ago|reply
[+] [-] tantalor|13 years ago|reply
Surely consistent messaging and notifications is better for the user. Chrome has a desktop notifications API, but that's only appropriate for certain types of messages, such as receiving a new email. In general, it's probably best to handle messaging at the application level.
[+] [-] BaconJuice|13 years ago|reply
[+] [-] jamespo|13 years ago|reply
[+] [-] adam-a|13 years ago|reply
I have been looking for a X-browser way to do this myself and the best I cam up with so far was to ping google.com with a XHR OPTIONS type request. Pretty ugly, but it works.
[+] [-] sdqali|13 years ago|reply
[+] [-] elliottcarlson|13 years ago|reply
* Worked after I relaunched Chrome and updated to 23.0.1271.64
[+] [-] flux_w42|13 years ago|reply
[+] [-] tunnuz|13 years ago|reply
[+] [-] chacham15|13 years ago|reply