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

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


person Daniel Silveira    schedule 09.10.2008    source источник
comment
Если вы можете или уже используете веб-сокеты - веб-сокеты имеют событие закрытия, которое должно вызываться, если пользователь потерял соединение с сервером.   -  person Simon    schedule 31.01.2019
comment
Это напоминает мне 90-е, когда все, что вам нужно было сделать, это объявить события изображения с помощью image = new Image (); image.onload = onloadfunction; image.onerror = onerrorfunction; затем установить image.src = image.gif? + Math. случайный(); Я думаю, что это работает и сегодня.   -  person PHP Guru    schedule 23.09.2020


Ответы (22)


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

Стандартный подход - это повторить запрос несколько раз. Если этого не произошло, предупредите пользователя о необходимости проверки соединения и завершите с ошибкой.

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

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

Дополнительное примечание: Отправка пинга может быть достигнута так же, как и любой двусторонний запрос ajax, но в этом случае отправка пинга в Google создаст некоторые проблемы. Во-первых, мы столкнемся с теми же проблемами междоменного взаимодействия, которые обычно возникают при обмене данными Ajax. Один из вариантов - настроить прокси на стороне сервера, в котором мы фактически ping google (или любой другой сайт) и возвращаем результаты проверки связи в приложение. Это уловка-22, потому что, если на самом деле проблема связана с подключением к Интернету, мы не сможем добраться до сервера, а если проблема с подключением только в нашем собственном домене, мы выиграем » Я не смогу заметить разницу. Можно попробовать другие междоменные методы, например, встраивание iframe на вашу страницу, который указывает на google.com, а затем опрос iframe на предмет успеха / неудачи (проверка содержимого и т. Д.). Встраивание изображения может нам ничего не сказать, потому что нам нужен полезный ответ от механизма связи, чтобы сделать правильный вывод о том, что происходит. Итак, опять же, определение состояния интернет-соединения в целом может быть больше проблем, чем оно того стоит. Вам нужно будет взвесить эти параметры для вашего конкретного приложения.

person keparo    schedule 09.10.2008
comment
Повторяющееся примечание на полях звучит так, будто Дуайт Шруте говорит Вопрос ... :-) - person Brian Kelly; 29.12.2009
comment
Почему уловка-22 выделена жирным шрифтом? - person codingbear; 29.12.2009
comment
Теперь в 2012 году вы можете проверить переменную navigator.onLine;) - person João Pinto Jerónimo; 23.04.2012
comment
navigator.online/offline также ненадежен по тем же причинам. См. stackoverflow.com / questions / 3181080 / - person Efran Cobisi; 11.09.2012
comment
Вы можете попробовать Offline.js, библиотеку с открытым исходным кодом, созданную именно для этой цели. - person Adam; 28.10.2013
comment
Помимо проблем с надежностью (от этой проблемы страдают все решения), navigator.onLine определенно лучший вариант сейчас, когда перекрестно браузер. - person Stijn de Witt; 26.06.2015
comment
"One option is to set up a server-side proxy, wherein we actually ping google (or whatever site), and return the results of the ping to the app". Его не следует рассматривать как возможное решение для изучения. Даже если бы у меня было соединение с моим сервером, я хочу проверить, могу ли я получить доступ к Google, а не к моему серверу. - person Marinos An; 29.09.2020

Почти все основные браузеры теперь поддерживают _ 1_ и соответствующие события окна online и offline. Запустите следующий фрагмент кода, чтобы проверить его:

console.log('Initially ' + (window.navigator.onLine ? 'on' : 'off') + 'line');

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

document.getElementById('statusCheck').addEventListener('click', () => console.log('window.navigator.onLine is ' + window.navigator.onLine));
<button id="statusCheck">Click to check the <tt>window.navigator.onLine</tt> property</button><br /><br />
Check the console below for results:

Попробуйте установить свою систему или браузер в автономный / онлайн-режим и проверьте журнал или свойство window.navigator.onLine на наличие изменений значений.

Однако обратите внимание на эту цитату из документации Mozilla:

В Chrome и Safari, если браузер не может подключиться к локальной сети (LAN) или маршрутизатору, он отключен; все остальные условия возвращают true. Таким образом, хотя вы можете предположить, что браузер находится в автономном режиме, когда он возвращает значение false, вы не можете предполагать, что значение true обязательно означает, что браузер может получить доступ к Интернету. Вы можете получать ложные срабатывания, например, в тех случаях, когда на компьютере запущено программное обеспечение виртуализации, у которого есть виртуальные адаптеры Ethernet, которые всегда подключены. Поэтому, если вы действительно хотите определить онлайн-статус браузера, вам следует разработать дополнительные средства для проверки.

В Firefox и Internet Explorer при переключении браузера в автономный режим отправляется значение false. До Firefox 41 все остальные условия возвращают значение true; начиная с Firefox 41 в OS X и Windows значение будет соответствовать фактическому сетевому подключению.

(курсив мой)

Это означает, что если window.navigator.onLine равно false (или вы получили событие offline), у вас гарантированно нет подключения к Интернету.

Однако, если это true (или вы получаете событие online), это означает, что система в лучшем случае подключена к какой-либо сети. Это не означает, например, что у вас есть доступ в Интернет. Чтобы проверить это, вам все равно нужно будет использовать одно из решений, описанных в других ответах.

Изначально я намеревался опубликовать это как обновление для ответа Гранта Вагнера, но это казалось слишком большим изменением, особенно с учетом того, что обновление 2014 года уже было не от него.

person Didier L    schedule 17.12.2018
comment
Лучший ответ. Спасибо. - person vibs2006; 19.12.2019
comment
Недавно у меня была возможность немного поработать над автономным поведением. Мероприятия удобны в использовании, НО ios safari создаст проблемы. Когда вы отключаете Интернет на своем телефоне, офлайн / онлайн-события будут отложены до 2 секунд, что может быть проблематичным по причинам визуального рендеринга, так как вы не можете предсказать будущее. Это просто то, о чем я хотел упомянуть и мог бы кому-то помочь. - person TeeJaay; 27.05.2020
comment
Пока vpn подключен, если мы отключим интернет, тогда window.navigator.onLine не будет работать - person Sagar; 16.04.2021
comment
@Sagar Я проверил в Firefox и Chrome, если я отключу кабель при подключении к моему рабочему VPN, они оба быстро обнаружат отключение. Они не ждут, пока VPN повторно подключится, чтобы сообщить о своем онлайн-статусе - как я указал в ответе, online просто означает, что у вас есть какое-то соединение, а не то, что у вас есть доступ в Интернет. Я воспользовался этой возможностью, чтобы добавить отрывок в свой ответ, чтобы проверить его. - person Didier L; 16.04.2021
comment
Должен быть выбран ответ! - person imike; 01.06.2021
comment
@imike Это зависит от того, кто задает вопрос, и он не проявлял активности более 10 лет :) Я надеюсь превзойти принятый ответ, но, к сожалению, , который не изменит их порядок. - person Didier L; 01.06.2021

IE 8 будет поддерживать window.navigator. onLine свойство.

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

Пока этого не произошло, либо XHR, либо Image() или <img> запрос могут предоставить что-то близкое к той функциональности, которую вы хотите.

Обновление (16.11.2014)

Основные браузеры теперь поддерживают это свойство, но ваши результаты будут другими.

Цитата из документации Mozilla:

В Chrome и Safari, если браузер не может подключиться к локальной сети (LAN) или маршрутизатору, он отключен; все остальные условия возвращают true. Таким образом, хотя вы можете предположить, что браузер находится в автономном режиме, когда он возвращает значение false, вы не можете предположить, что истинное значение обязательно означает, что браузер может получить доступ к Интернету. Вы можете получать ложные срабатывания, например, в тех случаях, когда на компьютере запущено программное обеспечение виртуализации, у которого есть виртуальные адаптеры Ethernet, которые всегда подключены. Поэтому, если вы действительно хотите определить онлайн-статус браузера, вам следует разработать дополнительные средства для проверки.

В Firefox и Internet Explorer при переключении браузера в автономный режим отправляется значение false. Все остальные условия возвращают значение true.

person Grant Wagner    schedule 09.10.2008
comment
navigator.onLine является частью HTML5 - в других браузерах уже есть разрабатываемые версии, которые его предоставляют - сегодня он уже доступен в Firefox 3. - person olliej; 10.10.2008
comment
-но, к сожалению, недоступно в более ранних версиях IE, которые нам часто требуется поддерживать. - person keparo; 10.10.2008
comment
navigator.onLine показывает состояние браузера, а не фактическое соединение. Таким образом, у вас может быть установлен ваш браузер в режиме onLine, но на самом деле это не удастся, потому что соединение не работает. navigator.onLine будет ложным только в том случае, если браузер настроен на просмотр в автономном режиме. - person ; 27.04.2010
comment
если я отключу WI-FI на своем Nexus7, на странице все равно будет написано, что navigator.onLine - ИСТИНА. Плохой... - person walv; 12.09.2014

Для этого есть несколько способов:

  • Запрос AJAX на ваш собственный сайт. Если этот запрос не выполняется, велика вероятность, что в этом виновато соединение. В документации JQuery есть раздел на обработка неудачных запросов AJAX. При этом остерегайтесь одинаковой политики происхождения, которая может помешать вам получить доступ к сайтам за пределами вашего домена. .
  • Вы можете поместить onerror в img, например <img src="http://www.example.com/singlepixel.gif" onerror="alert('Connection dead');" />.

Этот метод также может выйти из строя, если исходное изображение перемещено / переименовано, и, как правило, будет худшим выбором по сравнению с вариантом ajax.

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

person ConroyP    schedule 09.10.2008

Вы можете использовать обратный вызов error $ .ajax (), который срабатывает, если запрос не выполняется. Если textStatus равно строке «тайм-аут», это, вероятно, означает, что соединение разорвано:

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

Из документа:

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

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

person olliej    schedule 09.10.2008
comment
Как обсуждалось в другом ответе, на самом деле это не работает так, как ожидалось. У вас может не быть интернета, и navigator.onLine все равно вернет true. - person TheCarver; 16.10.2020

window.navigator.onLine

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

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

и для проверки онлайн:

window.addEventListener("online", 
  ()=> console.log("Connected Internet")
);
person Alireza    schedule 31.10.2019
comment
Вы должны быть осторожны с onLine. Браузеры по-разному определяют состояние онлайн. Взгляните на developer.mozilla.org/en-US/ документы / Web / API / NavigatorOnLine / onLine. - person Andreas Baumgart; 22.01.2020
comment
Также это надежно, только если вы делаете запросы. Просто выключите Wi-Fi или отключите Ethernet и проверьте это свойство. Тем не менее верно. - person Douglas Gaskell; 24.12.2020

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

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

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

person Community    schedule 20.08.2009
comment
ОБНОВЛЕНИЕ: по состоянию на 2015 год он, похоже, работает в большинстве браузеров, см. диаграмму caniuse и статья - person Olga; 06.04.2016

Мне пришлось создать веб-приложение (на основе 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();
        }
    });
}
person THEO    schedule 12.04.2011

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

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

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

Например. error = 404 по-прежнему означает, что вы в сети.

person harishr    schedule 22.04.2015

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

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;
person Prakash Pazhanisamy    schedule 03.10.2017
comment
onLine не означает, что есть подключение к Интернету. Согласно developer.mozilla.org/en-US/docs/ Интернет / 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 - person Shmuel Kamensky; 09.06.2020

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

Я нашел способ обнаружить это, ища 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)
        }
    }
});
person wayofthefuture    schedule 12.03.2016
comment
Это не работает на 10-5-2016, не знаю, почему просто не хотите, чтобы время других людей было потрачено зря. - person Bren; 06.10.2016
comment
Не думаю, что это сработает для запрещенных и неверных ошибок запроса :) - person Faisal Naseer; 07.02.2018

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

Window.navigator.onLine

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

Этот вариант предполагает использование window.navigator.onLine, который является свойством в интерфейсе навигатора браузера и доступен в большинстве современных браузеров. Это действительно не подходящий вариант для проверки доступности Интернета, потому что, во-первых, it is browser centric, а во-вторых most browsers implement this property differently.

В Firefox: свойство возвращает логическое значение, где true означает онлайн, а false означает автономный режим, но здесь есть предостережение: the value is only updated when the user follows links or when a script requests a remote page. Следовательно, если пользователь переходит в автономный режим и вы запрашиваете свойство из функции или скрипта js, свойство всегда будет возвращать true, пока пользователь не перейдет по ссылке.

В Chrome и Safari: если браузер не может подключиться к локальной сети (LAN) или маршрутизатору, он отключен; все остальные условия возвращают истину. Таким образом, хотя вы можете предположить, что браузер находится в автономном режиме, когда он возвращает ложное значение, вы не можете предполагать, что истинное значение обязательно означает, что браузер может получить доступ к Интернету. Вы можете получать ложные срабатывания, например, в тех случаях, когда на компьютере запущено программное обеспечение виртуализации, у которого есть виртуальные адаптеры Ethernet, которые всегда подключены.

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

Отправка запроса на собственный ресурс сервера

This involves making HTTP request to your own server resource and if reachable assume internet availability else the user is offline. There are some few caveats to this option.
  1. Доступность сервера не зависит на 100%, поэтому, если по какой-то причине ваш сервер недоступен, было бы ошибочно предположить, что пользователь находится в автономном режиме, в то время как он подключен к Интернету.
  2. Несколько запросов к одному и тому же ресурсу могут вернуть кешированный ответ, что сделает результат ответа http ненадежным.

Если вы согласны с тем, что ваш сервер всегда в сети, вы можете воспользоваться этой опцией.

Вот простой фрагмент для получения собственного ресурса:

// This fetches your website's favicon, so replace path with favicon url
// Notice the appended date param which helps prevent browser caching.
fetch('/favicon.ico?d='+Date.now())
  .then(response => {
    if (!response.ok)
      throw new Error('Network response was not ok');

   // At this point we can safely assume the user has connection to the internet
        console.log("Internet connection available"); 
  })
  .catch(error => {
  // The resource could not be reached
        console.log("No Internet connection", error);
  });

Отправка запроса на сторонний серверный ресурс

We all know CORS is a thing.

Этот вариант включает выполнение HTTP-запроса к внешнему ресурсу сервера и, если он доступен, предположим, что Интернет доступен, в противном случае пользователь находится в автономном режиме. Главное предостережение - это совместное использование ресурсов разных источников, которое действует как ограничение. Большинство авторитетных веб-сайтов блокируют запросы CORS, но для некоторых вы можете поступить по-своему.

Ниже приведен простой фрагмент для получения внешнего ресурса, такой же, как и выше, но с URL-адресом внешнего ресурса:

// Firstly you trigger a resource available from a reputable site
// For demo purpose you can use the favicon from MSN website
// Also notice the appended date param which helps skip browser caching.
fetch('https://static-global-s-msn-com.akamaized.net/hp-neu/sc/2b/a5ea21.ico?d='+Date.now())
  .then(response => {
  // Check if the response is successful
    if (!response.ok)
      throw new Error('Network response was not ok');

// At this point we can safely say the user has connection to the internet
        console.log("Internet available"); 
  })
  .catch(error => {
  // The resource could not be reached
        console.log("No Internet connection", error);
  });

Итак, наконец, для моего личного проекта я выбрал второй вариант, который включает в себя запрос собственного ресурса сервера, потому что в основном есть много факторов, чтобы определить, есть ли подключение к Интернету на устройстве пользователя, а не только из одного контейнера вашего веб-сайта или из ограниченного API браузера. .

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

  • Попробуйте получить доступ к ресурсу на вашем собственном сервере, потому что это среда вашего пользователя (обычно я использую значок веб-сайта, потому что ответ очень легкий и не часто обновляется).
  • Если нет подключения к ресурсу, просто скажите «Ошибка подключения» или «Подключение потеряно», когда вам нужно уведомить пользователя, вместо того, чтобы предполагать широкое подключение к Интернету «Нет», которое зависит от многих факторов.
person Giddy Naya    schedule 28.09.2020

Мой метод.

<!-- 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>
person unxed    schedule 01.11.2010

Просто используйте navigator.onLine, если это true, тогда вы в сети, иначе в автономном режиме

person Karan Tewari    schedule 23.11.2020
comment
Это во многом бесполезно. Я отключаюсь от Wi-Fi или подключаю кабель Ethernet к другому устройству, и это свойство по-прежнему остается верным, несмотря на то, что я фактически не подключен к сети. По-прежнему нужно делать неудачные запросы XHR - person Douglas Gaskell; 24.12.2020
comment
@DouglasGaskell, ох, я этого не знал, спасибо, что поправили меня :) - person Karan Tewari; 26.12.2020
comment
@DouglasGaskell Я не согласен с тем, что вы упомянули. window.navigator.onLine, это работает должным образом. Вам нужно прослушать _2 _ / _ 3_ события, чтобы увидеть изменения. Пожалуйста, проверьте medium.com/@JackPu/ или developer.mozilla.org/en-US/docs/Web / API / NavigatorOnLine / onLine для справки - person phoenisx; 31.12.2020
comment
@phoenisx Я не знаю, с чем не согласиться? Проверьте это свойство в своем браузере, отключите доступ к Интернету, а затем проверьте его еще раз. Это все еще правда. В связанном вами документе даже указано you cannot assume that a true value necessarily means that the browser can access the internet. который подытоживает его полезность при обнаружении состояний онлайн / офлайн. Там также написано if the browser is not able to connect to a local area network (LAN) or a router, it is offline, что, опять же, показывает, что его полезность ОЧЕНЬ ограничена. - person Douglas Gaskell; 01.01.2021
comment
@DouglasGaskell: Я полностью согласен с вашей точкой зрения. Его вариант использования ограничен, если вы хотите очень точно отслеживать интернет-соединение. Хотя в большинстве случаев обычные пользователи не связываются со своими сетевыми драйверами, настройками браузера и не используют гипервизоры, для таких случаев это значение (или прослушиватели событий) является единственным вариантом для отображения некоторых описательных сообщений, когда пользователь переходит в автономный режим. - person phoenisx; 04.01.2021
comment
@DouglasGaskell В заявлении u, сделанном ранее, говорится, что значение никогда не меняется при выключении или включении WiFi, но это не так. Я не тестировал его с драйверами Ethernet, но уверен, что он тоже должен работать с ним. Да, это правда, что в зависимости от этой переменной время от времени может быть бесполезным, поскольку для некоторых конкретных ситуаций значение может быть ложным срабатыванием, как указано в документе, но в большинстве случаев, когда пользователи просматривают обычные системы (не виртуальные) , и их сетевые драйверы не содержат ошибок, это значение будет истинным (если у них нет проблем, связанных с интернет-провайдером). - person phoenisx; 04.01.2021

Вы можете попробовать, это вернет истину, если сеть подключена

function isInternetConnected(){return navigator.onLine;}
person Siddhartha    schedule 21.02.2021

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

$.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"); 
              }
         });
    }   
});
person Kareem    schedule 28.05.2018

Проблема некоторых методов, таких как 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 :(');
         }
     }
}
person Vladimir Salguero    schedule 19.07.2019

Как насчет отправки непрозрачного HTTP-запроса на google.com без-cors?

    fetch('https://google.com', {
        method: 'GET', // *GET, POST, PUT, DELETE, etc.
        mode: 'no-cors',
    }).then((result) => {
        console.log(result)
    }).catch(e => {
        console.error(e)
    })

Причина установки no-cors заключается в том, что я получал ошибки cors даже при нарушении балансировки сетевого соединения на моем компьютере. Итак, я получал блокировку cors с подключением к Интернету или без него. Добавление no-cors делает запрос непрозрачным, что, по всей видимости, обходит cors и позволяет мне просто проверить, могу ли я подключиться к Google.

К вашему сведению: я использую здесь выборку для выполнения HTTP-запроса. https://www.npmjs.com/package/fetch

person CantThinkOfAnything    schedule 28.04.2021

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

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

Вы должны использовать это с обнаружением метода, иначе используйте «альтернативный» способ сделать это. Быстро приближается время, когда это будет все, что нужно. Остальные методы - это взломы.

person Community    schedule 29.10.2009

На два разных сенария есть 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.

    Стандартный подход - повторить запрос несколько раз. Если этого не произошло, предупредите пользователя, чтобы он проверил соединение, и корректно завершите работу.

person Rishabh Anand    schedule 23.04.2018
comment
Есть разница между нахождением в сети и доступом в Интернет. - person ShivCK; 27.05.2021

person    schedule
comment
Он всегда возвращает TRUE, если в браузере. - person Slavcho; 17.06.2013
comment
Сначала я пытался отключить ТОЛЬКО LAN, но он всегда возвращал ИСТИНА. Поэтому, когда я отключил все сети (LAN2, Virtual Box и т. Д.), Он вернул FALSE. - person Slavcho; 17.06.2013
comment
Этот ответ дублирует несколько существующих ответов трехлетней давности. - person JasonMArcher; 16.11.2014
comment
он не проверяет подключение к Интернету, он проверяет только подключение к локальной сети - person Suganth G; 05.07.2016
comment
У меня работал в HTML 5, JavaScript, в Mac book (с использованием Wi-Fi), даже работал на мобильных устройствах. но проблема в том, что когда Wi-Fi включен, он возвращает TRUE каждый раз, даже если я выключаю Wi-Fi наоборот. - person S.Yadav; 19.06.2017
comment
Он всегда возвращает истину во всех браузерах. - person mitesh7172; 21.01.2019
comment
Он всегда возвращает TRUE, если Интернет подключен, но просмотр отключен. Нам нужно проверить оба условия. Есть идеи? - person faisal bhatti; 16.09.2019
comment
Согласно документации MDN для navigator.onLine, находящейся по адресу Navigator.onLine, вы можете видеть изменения в состоянии сети, прислушиваясь к событиям на window.ononline и window.onoffline. - person weasel5i2; 08.11.2019
comment
onLine всегда возвращает true, даже если у вас активна только горячая точка. onLine просто означает, что вы подключены к ЛЮБОЙ сети. (ononline и onoffline означают одно и то же) - person Victor Gorban; 06.07.2020