インターネット接続がオフラインであることを検出しますか?


246

JavaScriptでインターネット接続がオフラインであることを検出するにはどうすればよいですか?


websocketを使用できる場合、またはすでに使用している場合-websocketには、ユーザーがサーバーへの接続を失った場合に呼び出す必要があるCloseイベントがあります。
Simon、

回答:


135

失敗したXHRリクエストを行うことで、接続が失われたと判断できます

標準的なアプローチは、リクエストを数回再試行することです。うまくいかない場合は、接続を確認するようユーザー警告し、正常に失敗します。

補足:アプリケーション全体を「オフライン」の状態にすると、エラーの発生しやすい処理の状態が大量に発生する可能性があります。ワイヤレス接続の開始や終了などが発生する可能性があります。データがあれば、ユーザーに警告します。最終的には接続の問題がある場合はそれらを修正し、かなりの寛容さでアプリの使用を継続できるようにします。

補足: Googleのような信頼性の高いサイトで接続を確認することもできますが、これは、自分のリクエストを作成するだけでは完全に役立つとは限りません。独自の接続問題を処理する必要があります。pingをgoogleに送信することは、インターネット接続自体がダウンしていることを確認するための良い方法です。その情報が役立つ場合は、トラブルに値するかもしれません。

補足Pingの送信は、あらゆる種類の双方向Ajaxリクエストを行うのと同じ方法で実現できますが、この場合、Pingをgoogleに送信すると、いくつかの課題が発生します。まず、Ajax通信の作成で通常発生するのと同じクロスドメインの問題があります。1つのオプションは、サーバー側のプロキシを設定することです。この場合、実際にpinggoogle(またはその他のサイト)を実行し、pingの結果をアプリに返します。これはキャッチです-22インターネット接続が実際に問題である場合、サーバーにアクセスできず、接続問題が自分のドメインでのみ発生している場合は、違いを区別できません。たとえば、google.comを参照するiframeをページに埋め込み、iframeをポーリングして成功/失敗を調べます(コンテンツを調べるなど)。何が起こっているのかについて適切な結論を出すためには、通信メカニズムからの有用な応答が必要であるため、画像を埋め込んでも実際には何もわかりません。繰り返しになりますが、インターネット接続の状態を全体として判断することは、それよりも困難な場合があります。特定のアプリに対してこれらのオプションを重み付けする必要があります。


84
言っドワイトSchruteのように繰り返される「追記」の音「の質問を...」:-)
ブライアン・ケリー

19
「catch-22」が太字になっているのはなぜですか?
コーディングベア2009

33
2012年には、変数navigator.onLineをチェックできます;)
JoãoPintoJerónimo

13
navigator.online/offlineも同様の理由で信頼できません。stackoverflow.com/questions/3181080/…を
エフランコビシ

17
この目的のために作成されたオープンソースライブラリであるOffline.jsをチェックしてみてください。
アダム

51

IE 8はwindow.navigator.onLineプロパティをサポートします。

しかし、もちろんそれは他のブラウザやオペレーティングシステムでは役に立ちません。Ajaxアプリケーションでオンライン/オフラインの状態を知ることの重要性を考えると、他のブラウザーベンダーもそのプロパティを提供することを決定すると予測しています。

それが発生するまで、XHRまたはImage()or <img>リクエストのいずれかで、必要な機能に近いものを提供できます。

アップデート(2014/11/16)

主要なブラウザがこのプロパティをサポートするようになりましたが、結果は異なります。

Mozillaドキュメントからの引用:

ChromeとSafariでは、ブラウザーがローカルエリアネットワーク(LAN)またはルーターに接続できない場合、ブラウザーはオフラインです。他のすべての条件が返されtrueます。したがって、false値を返すときにブラウザがオフラインであると想定することはできますが、真の値がブラウザがインターネットにアクセスできることを必ずしも意味するとは限りません。たとえば、コンピューターが常に「接続」されている仮想イーサネットアダプターを備えた仮想化ソフトウェアを実行している場合など、誤検知が発生している可能性があります。したがって、ブラウザのオンラインステータスを本当に確認したい場合は、追加のチェック方法を開発する必要があります。

FirefoxおよびInternet Explorerでは、ブラウザーをオフラインモードに切り替えるとfalse値が送信されます。他のすべての条件はtrue値を返します。


5
navigator.onLineはHTML5の一部です-他のブラウザーは既にそれを提供する開発バージョンを持っています-今日のFirefox 3ですでに利用可能です。
olliej

-残念ながら以前のバージョンのIEではサポートされていません。
keparo 08年

22
navigator.onLineは、実際の接続ではなく、ブラウザの状態を示します。したがって、ブラウザをオンラインに設定できますが、接続がダウンしているため実際には失敗します。navigator.onLineは、ブラウザーがオフラインブラウジングに設定されている場合にのみfalseになります。

5
Nexus7でWI-FIをオフにしても、navigator.onLineがTRUEであるとページに表示されます。悪い...
walv 14

42

ほぼすべての主要なブラウザは今サポートしてwindow.navigator.onLineプロパティを、対応するonlineofflineウィンドウのイベント:

window.addEventListener('online', () => console.log('came online'));
window.addEventListener('offline', () => console.log('came offline'));

システムまたはブラウザをオフライン/オンラインモードに設定して、コンソールまたはwindow.navigator.onLineプロパティで値の変更を確認してください。このWebサイトでもテストできます。

ただし、Mozilla Documentationからのこの引用に注意してください。

ChromeとSafariでは、ブラウザーがローカルエリアネットワーク(LAN)またはルーターに接続できない場合、ブラウザーはオフラインです。他のすべての条件が返されtrueます。一方、だから、あなたが想定することができ、それが戻ったときに、ブラウザがオフラインであることfalse価値をあなたがいると仮定することはできませんtrue値は、必ずしもブラウザがインターネットにアクセスできることを意味します。たとえば、コンピューターが常に「接続」されている仮想イーサネットアダプターを備えた仮想化ソフトウェアを実行している場合など、誤検知が発生している可能性があります。したがって、ブラウザのオンラインステータスを本当に確認したい場合は、チェックするための追加の手段を開発する必要があります。

FirefoxおよびInternet Explorerでは、ブラウザーをオフラインモードに切り替えるとfalse値が送信されます。Firefox 41までは、他のすべての条件がtrue値を返します。Firefox 41以降、OS XとWindowsでは、値は実際のネットワーク接続に従います。

(強調は私自身のものです)

これは、でwindow.navigator.onLineあるfalse(またはofflineイベントを取得する)場合、インターネット接続がないことが保証されることを意味します。

trueただし、それが(またはonlineイベントを取得する)場合は、システムがネットワークに接続されていることを意味します。たとえば、インターネットにアクセスできるという意味ではありません。それを確認するには、他の回答で説明されているソリューションのいずれかを使用する必要があります。

私は当初、これをGrant Wagnerの回答の更新として投稿するつもりでしたが、特に2014年の更新がまだ彼からのものでなかったことを考えると、編集が多すぎるように思われました


ベストアンサー。ありがとう。
vibs2006

1
私は最近、オフラインでの行動に少し取り組む機会がありました。イベントは使用するのに最適ですが、iOSサファリでは問題が発生します。スマートフォンでインターネットをオンにすると、オフライン/オンラインイベントが最大2秒遅れ、将来を予測できないため、視覚的なレンダリングの問題が発生する可能性があります。それは私が言及したかっただけのものであり、誰かを助けるかもしれません。
TeeJaay

38

これを行う方法はいくつかあります。

  • あなた自身のウェブサイトへのAJAXリクエスト。そのリクエストが失敗した場合は、接続に問題がある可能性があります。jQueryののドキュメントは上のセクションがある失敗したAJAX要求を処理します。これを行うときは、同一生成元ポリシーに注意してください。ドメイン外のサイトにアクセスできなくなる可能性があります。
  • あなたは置くことができるonerrorimgように、

    <img src='http://www.example.com/singlepixel.gif' 
          onerror='alert("Connection dead");' />
    

    この方法は、ソースイメージが移動または名前変更された場合にも失敗する可能性があり、通常はajaxオプションよりも劣ります。

したがって、これを試行して検出する方法はいくつかありますが、完璧ではありませんが、ブラウザのサンドボックスからジャンプしてユーザーのネット接続ステータスに直接アクセスする機能がない場合は、それらが最良のオプションのようです。


36
 if(navigator.onLine){
  alert('online');
 } else {
  alert('offline');
 }

11
ブラウザの場合は常にTRUEを返します。
Slavcho 2013年

2
最初に、LANのみを無効にしようとしましたが、常にTRUEを返していました。したがって、すべてのネットワーク(LAN2、Virtual Boxなど)を無効にすると、FALSEが返されました。
Slavcho 2013年

3
この回答は、3年前のいくつかの既存の回答を複製したものです。
JasonMArcher 2014年

2
インターネット接続をチェックするのではなく、LAN接続のみをチェックする
Suganth G

HTML 5、JavaScript、Macブック(wifiを使用)で私のために働き、モバイルでも働きました。しかし、問題は-私がwifiをオフにしても、オンのwifiがTRUEを返す場合はその逆です。
S.Yadav 2017年

11

HTML5アプリケーションキャッシュAPIは、navigator.onLineを指定します。これは、現在IE8ベータ版、WebKit(例:Safari)ナイトリーで利用可能で、Firefox 3ですでにサポートされています。


11

$ .ajax()errorコールバックを使用できます。コールバックは、リクエストが失敗した場合に起動します。場合はtextStatus、文字列「タイムアウト」に等しい、それはおそらく、接続が切断されることを意味します:

function (XMLHttpRequest, textStatus, errorThrown) {
  // typically only one of textStatus or errorThrown 
  // will have info
  this; // the options for this ajax request
}

ドキュメントから:

エラー:リクエストが失敗した場合に呼び出される関数。関数には3つの引数が渡されます。XMLHttpRequestオブジェクト、発生したエラーのタイプを説明する文字列、およびオプションの例外オブジェクト(発生した場合)です。2番目の引数(null以外)の可能な値は、「timeout」、「error」、「notmodified」、および「parsererror」です。これはAjaxイベントです

だから例えば:

 $.ajax({
   type: "GET",
   url: "keepalive.php",
   success: function(msg){
     alert("Connection active!")
   },
   error: function(XMLHttpRequest, textStatus, errorThrown) {
       if(textStatus == 'timeout') {
           alert('Connection seems dead!');
       }
   }
 });

9

olliejが言ったように、使用したnavigator.onLineブラウザのプロパティがそれに応じて、ネットワーク要求を送信し、より望ましいdeveloper.mozilla.org/En/Online_and_offline_events、それもFirefoxとIEの古いバージョンでサポートされています。

最近、変更に対応する必要がある場合に備えて、WHATWGがonlineおよびofflineイベントの追加を指定していnavigator.onLineます。

また、Daniel Silveiraによって投稿されたリンクにも注意してください。サーバーとの同期をこれらの信号/プロパティに依存することは必ずしも良い考えとは限りません。


更新:2015年現在、ほとんどのブラウザーで機能しているようです。カヌースチャート記事を参照してください
Olga

8
window.navigator.onLine

あなたが探しているものですが、ここで追加するものはいくつかあります。まず、それがアプリでチェックし続けたいものである場合(たとえば、ユーザーが突然オフラインになったかどうかを確認します。この場合、ほとんどの場合これが修正されます)変更をリッスンする必要もあります)、ウィンドウにイベントリスナーを追加して変更を検出し、ユーザーがオフラインになったかどうかを確認するには、次のようにします。

window.addEventListener("offline", 
  ()=> console.log("No Internet")
);

オンラインかどうかを確認するには:

window.addEventListener("online", 
  ()=> console.log("Connected Internet")
);

2
に注意する必要がありonLineます。ブラウザは、オンライン状態を非常に異なって定義します。developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLineをご覧ください。
Andreas Baumgart

1
あなたの答えは間違っています。'onLine'プロパティは、インターネットの接続性とは関係ありません。上記のWeb APIに関するリファレンスを参照してください。
アレクサンドルV.

7

私は学校でよく仕事をしている顧客のためにWebアプリ(ajaxベース)を作成する必要がありました。これらの学校はインターネット接続が悪いことがよくあります。この簡単な機能を使用して、接続があるかどうかを検出します。

私はCodeIgniterとJqueryを使用しています:

function checkOnline() {
    setTimeout("doOnlineCheck()", 20000);
}

function doOnlineCheck() {
    //if the server can be reached it returns 1, other wise it times out
    var submitURL = $("#base_path").val() + "index.php/menu/online";

    $.ajax({
        url : submitURL,
        type : "post",
        dataType : "msg",
        timeout : 5000,
        success : function(msg) {
            if(msg==1) {
                $("#online").addClass("online");
                $("#online").removeClass("offline");
            } else {
                $("#online").addClass("offline");
                $("#online").removeClass("online");
            }
            checkOnline();
        },
        error : function() {
            $("#online").addClass("offline");
            $("#online").removeClass("online");
            checkOnline();
        }
    });
}

6

ドメインへのajax呼び出しは、オフラインかどうかを検出する最も簡単な方法です

$.ajax({
      type: "HEAD",
      url: document.location.pathname + "?param=" + new Date(),
      error: function() { return false; },
      success: function() { return true; }
   });

これは単に概念を説明するためのものであり、改善する必要があります。

たとえばerror = 404は、あなたがオンラインであることを意味します


4

とても簡単な方法だと思います。

var x = confirm("Are you sure you want to submit?");
if (x) {
  if (navigator.onLine == true) {
    return true;
  }
  alert('Internet connection is lost');
  return false;
}
return false;

onLineは、インターネット接続があることを意味しません。developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLineに よると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
Shmuel Kamensky

2

インターネットがダウンしているかサーバーがダウンしているかを検出するクライアント側のソリューションを探していました。私が見つけた他のソリューションは、常にサードパーティのスクリプトファイルまたはイメージに依存しているようでしたが、これは時の試練に耐えられるようには思えませんでした。外部でホストされているスクリプトまたは画像が将来変更され、検出コードが失敗する可能性があります。

私は404コードでxhrStatusを探すことでそれを検出する方法を見つけました。さらに、JSONPを使用してCORS制限をバイパスします。404以外のステータスコードは、インターネット接続が機能していないことを示します。

$.ajax({
    url:      'https://www.bing.com/aJyfYidjSlA' + new Date().getTime() + '.html',
    dataType: 'jsonp',
    timeout:  5000,

    error: function(xhr) {
        if (xhr.status == 404) {
            //internet connection working
        }
        else {
            //internet is down (xhr.status == 0)
        }
    }
});

2
2016年10月5日現在、これは機能しません。なぜ他の人の時間を無駄にしたくないのかはわかりません。
2016年

私はそうは思わないので、それは禁じられたそして悪い要求エラーのために働くでしょう:)
Faisal Naseer

1

私のやり方。

<!-- the file named "tt.jpg" should exist in the same directory -->

<script>
function testConnection(callBack)
{
    document.getElementsByTagName('body')[0].innerHTML +=
        '<img id="testImage" style="display: none;" ' +
        'src="tt.jpg?' + Math.random() + '" ' +
        'onerror="testConnectionCallback(false);" ' +
        'onload="testConnectionCallback(true);">';

    testConnectionCallback = function(result){
        callBack(result);

        var element = document.getElementById('testImage');
        element.parentNode.removeChild(element);
    }    
}
</script>

<!-- usage example -->

<script>
function myCallBack(result)
{
    alert(result);
}
</script>

<a href=# onclick=testConnection(myCallBack);>Am I online?</a>

1

以下のようないくつかの方法の問題はnavigator.onLine、彼らが一部のブラウザやモバイルバージョンと互換性がないということで、私をたくさん助けたオプションは、古典的な使用していたXMLHttpRequest方法をしても応答して、ファイルがキャッシュに格納された可能性がケースを予知することはXMLHttpRequest.statusより大きく、 200未満、304未満。

これが私のコードです:

 var xhr = new XMLHttpRequest();
 //index.php is in my web
 xhr.open('HEAD', 'index.php', true);
 xhr.send();

 xhr.addEventListener("readystatechange", processRequest, false);

 function processRequest(e) {
     if (xhr.readyState == 4) {
         //If you use a cache storage manager (service worker), it is likely that the
         //index.php file will be available even without internet, so do the following validation
         if (xhr.status >= 200 && xhr.status < 304) {
             console.log('On line!');
         } else {
             console.log('Offline :(');
         }
     }
}

0

これには2つの異なるシナリオの2つの答えがあります。

  1. Webサイト(つまり、フロントエンド部分)でJavaScriptを使用している場合、最も簡単な方法は次のとおりです。

    <h2>The Navigator Object</h2>
    
    <p>The onLine property returns true if the browser is online:</p>
    
    <p id="demo"></p>
    
    <script>
      document.getElementById("demo").innerHTML = "navigator.onLine is " + navigator.onLine;
    </script>

  2. しかし、サーバー側(つまり、ノードなど)でjsを使用している場合、失敗したXHRリクエストを行うことで接続が失われたと判断できます。

    標準的なアプローチは、リクエストを数回再試行することです。うまくいかない場合は、接続を確認するようユーザーに警告し、正常に失敗します。


0

リクエストヘッドインリクエストエラー

$.ajax({
    url: /your_url,
    type: "POST or GET",
    data: your_data,
    success: function(result){
      //do stuff
    },
    error: function(xhr, status, error) {

      //detect if user is online and avoid the use of async
        $.ajax({
            type: "HEAD",
            url: document.location.pathname,
            error: function() { 
              //user is offline, do stuff
              console.log("you are offline"); 
              }
         });
    }   
});

-1

ここに私が持っているヘルパーユーティリティのスニペットがあります。これは名前空間付きのJavaScriptです。

network: function() {
    var state = navigator.onLine ? "online" : "offline";
    return state;
}

これをメソッド検出で使用する必要があります。そうでない場合は、これを行う「代替」方法を起動します。必要なのはこれで十分なときが近づいています。他の方法はハックです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.