Обнаружить, что подключение к интернету отключено?


Как обнаружить подключение к Интернету в автономном режиме в JavaScript?

16 175

16 ответов:

вы можете определить, что соединение потеряно, сделав неудачные запросы XHR.

стандартный подход к повторите запрос несколько раз. Если он не пройдет,предупреждения пользователя чтобы проверить соединение, и изящно не.

Sidenote: перевод всего приложения в состояние" offline " может привести к большому количеству ошибок, связанных с обработкой состояния.. беспроводные соединения могут прийти и так далее, и тому подобное. Таким образом, ваш лучший выбор может заключаться в том, чтобы просто потерпеть неудачу, сохранить данные и предупредить пользователя.. позволяя им в конечном итоге решить проблему подключения, если она есть, и продолжать использовать ваше приложение с изрядным количеством прощения.

Sidenote: вы можете проверить надежный сайт, такой как google для подключения, но это может быть не совсем полезно, Так как просто пытается сделать свой собственный запрос, потому что, хотя google может быть доступен, ваше собственное приложение может и не быть, и вам все равно придется решать свои собственные проблемы с подключением. Попытка отправить пинг в google будет хорошим способом подтвердить, что само подключение к интернету не работает, поэтому, если эта информация Вам полезна, то это может стоить того.

Примечание:отправка Ping может быть достигнуто таким же образом, что вы сделаете любой двусторонний запрос ajax, но отправка ping в google в этом случае создаст некоторые проблемы. Во-первых, мы бы имеют те же междоменные проблемы, которые обычно встречаются при создании ajax-коммуникаций. Один из вариантов-настроить прокси-сервер на стороне сервера, где мы на самом деле ping google (или любой другой сайт), и вернуть результаты пинга в приложение.. Это же catch-22, потому что если подключение к интернету на самом деле проблема, мы не сможем добраться до сервера, и если проблема подключения только на нашем собственном домене, мы не сможем сказать разницу. Другие кросс-Домены методы могут быть опробованы, например, встраивание iframe в вашу страницу, которая указывает на google.com, а затем опрос iframe для успеха / неудачи (проверьте содержимое и т. д.). Встраивание изображения может на самом деле ничего нам не сказать, потому что нам нужен полезный ответ от механизма связи, чтобы сделать хороший вывод о том, что происходит. Так что опять же, определение состояния подключения к интернету в целом может быть больше проблем, чем это стоит. Вы будете иметь, чтобы вес эти параметры для вашего конкретного приложения.

IE 8 будет поддерживать

есть несколько способов сделать это:

  • AJAX запрос на ваш собственный сайт. Если этот запрос не выполняется, есть хороший шанс, что это ошибка соединения. Элемент JQuery в документации есть раздел обработка неудачных запросов AJAX. Остерегайтесь Та Же Политика Происхождения при этом, что может остановить вас от доступа к сайтам за пределами вашего домена.
  • вы могли бы поставить onerror на img, как

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

    этот метод также может потерпеть неудачу, если исходное изображение перемещено / переименовано, и, как правило, будет уступать выбору ajax.

таким образом, есть несколько различных способов попытаться обнаружить это, ни один из них не идеален, но в отсутствие возможности выскочить из песочницы браузера и получить доступ к статусу сетевого подключения пользователя напрямую, они кажутся лучшими вариантами.

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

API кэша приложений HTML5 определяет навигатор.онлайн, который в настоящее время доступен в бета-версиях IE8, WebKit (например. Safari) nightlies, и уже поддерживается в Firefox 3

как сказал Олли, используя navigator.onLine свойство браузера предпочтительнее, чем отправка сетевых запросов и, соответственно, с developer.mozilla.org/En/Online_and_offline_events, он даже поддерживается старыми версиями Firefox и IE.

недавно WHATWG указал добавление online и offline события, в случае, если вам нужно реагировать на navigator.onLine изменения.

пожалуйста, Также обратите внимание на ссылку, опубликованную Даниэль Сильвейра, которая указывает что полагаться на эти сигналы/свойства для синхронизации с сервером не всегда хорошая идея.

можно использовать $.ajax () ' s error обратный вызов, который срабатывает при сбое запроса. Если textStatus равно строке "timeout" это, вероятно, означает, что соединение нарушено:

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

С doc:

: функция, которая будет вызвана, если запрос неудачи. Эту функцию передаются три аргумента: объект XMLHttpRequest , строка, описывающая тип ошибки что произошло и необязательно исключение объект, если таковой имел место. Возможные значения для второго аргумент (кроме null) - это " тайм-аут", "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!');
       }
   }
 });

мне пришлось сделать веб-приложение (на основе ajax) для клиента, который много работает со школами, эти школы часто имеют плохое подключение к интернету я использую эту простую функцию, чтобы определить, есть ли соединение, работает очень хорошо!

Я использую CodeIgniter и Jquery:

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

function doOnlineCheck(){
    var submitURL = $("#base_path").val() + "index.php/menu/online";//if the server can be reached it returns 1, other wise it times out
    $.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();
        }
    });
}

вызов ajax в ваш домен-это самый простой способ определить, находитесь ли вы в автономном режиме

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

это просто чтобы дать вам понятие, оно должно быть улучшено, проверить возвращенные коды состояния HTTP и т. д

Я думаю, что это очень простой способ.

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

Я искал решение на стороне клиента, чтобы определить, не работает ли интернет или мой сервер. Другие решения, которые я нашел, всегда, казалось, зависели от стороннего файла сценария или изображения, которое мне не казалось, что оно выдержит испытание временем. Внешний размещенный сценарий или образ могут измениться в будущем и вызвать сбой кода обнаружения.

Я нашел способ обнаружить его, ища xhrStatus с кодом 404. Кроме того, я использую 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)
        }
    }
});

очень интересный скрипт, который возобновляет много выше:

http://www.codeproject.com/KB/scripting/InternetConnectionTest.aspx

Это очень полезно, и потому что он основан на Ajax, является асинхронным, поэтому вы можете проверить, подключен ли Интернет, не покидая исходную страницу. Используя это с таймером, вы также можете иметь компонент на странице, проверяющий каждые n минут.

мой путь.

<!-- 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>

есть 2 ответа для двух разных сенариев: -

  1. Если вы используете 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.

    стандартный подход состоит в том, чтобы повторить запрос несколько раз. Если он не проходит, предупреждает пользователя, чтобы проверить соединение, и не работает изящно.

голова запроса в ошибке запроса

$.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"); 
              }
         });
    }   
});

вот фрагмент вспомогательной утилиты у меня есть. Это пространство имен javascript:

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

вы должны использовать это с обнаружением метода еще выстрелить "альтернативный" способ сделать это. Быстро приближается время, когда это будет все, что нужно. Другие методы-это хаки.