Проверьте, существует ли подключение к интернету с Javascript? [дубликат]

этот вопрос уже есть ответ здесь:

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

9 ответов


лучший вариант для вашего конкретного случая может быть:

прямо перед вашим закрытием </body> tag:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

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

если вы хотите более надежное решение, вы могли бы попробовать:

var online = navigator.onLine;

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

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

Я бы не рекомендовал делать запрос XHR к чужой службе, даже google.com если уж на то пошло. Сделайте запрос на свой сервер или не делайте вообще.

что значит быть "онлайн"?

кажется, есть некоторая путаница вокруг того, что означает "онлайн". Считайте, что интернет-это куча сетей, однако иногда вы находитесь на VPN, без доступа к интернету "по-большому" или всемирная компьютерная сеть. Часто компании имеют свои собственные сети, которые имеют ограниченное подключение к другим внешним сетям, поэтому вас можно считать "онлайн". Быть онлайн означает только то, что вы подключены к a сеть, а не доступность и достижимость служб, к которым вы пытаетесь подключиться.

чтобы определить, доступен ли хост из вашей сети, вы можете сделать следующее:

function hostReachable() {

  // Handle IE and more capable browsers
  var xhr = new ( window.ActiveXObject || XMLHttpRequest )( "Microsoft.XMLHTTP" );
  var status;

  // Open new request as a HEAD to the root hostname with a random param to bust the cache
  xhr.open( "HEAD", "//" + window.location.hostname + "/?rand=" + Math.floor((1 + Math.random()) * 0x10000), false );

  // Issue request and handle response
  try {
    xhr.send();
    return ( xhr.status >= 200 && (xhr.status < 300 || xhr.status === 304) );
  } catch (error) {
    return false;
  }

}

вы также можете найти суть здесь: https://gist.github.com/jpsilvashy/5725579

информация о реализации

некоторые люди прокомментировали: "мне всегда возвращают false". Это потому, что вы, вероятно, тестируете его на своем локальном сервере. На каком бы сервере вы ни делали запрос, вам нужно будет ответить на запрос HEAD, который, конечно, можно изменить на GET, если вы хотите.


хорошо, может быть, немного поздно в игре, но как насчет проверки с онлайн-изображением? Я имею в виду, ОП должен знать, нужно ли ему захватить CMD Google или локальную копию JQ, но это не значит, что браузер не может читать Javascript, несмотря ни на что, верно?

<script>
function doConnectFunction() {
// Grab the GOOGLE CMD
}
function doNotConnectFunction() {
// Grab the LOCAL JQ
}

var i = new Image();
i.onload = doConnectFunction;
i.onerror = doNotConnectFunction;
// CHANGE IMAGE URL TO ANY IMAGE YOU KNOW IS LIVE
i.src = 'http://gfx2.hotmail.com/mail/uxp/w4/m4/pr014/h/s7.png?d=' + escape(Date());
// escape(Date()) is necessary to override possibility of image coming from cache
</script>

только мои 2 цента


5 лет спустя-версия:

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

на этих https://github.com/hubspot/offline. Он проверяет подключение предопределенного URI, по умолчанию вашего favicon. Он автоматически определяет, когда подключение пользователя было восстановлено и обеспечивает аккуратные события, такие как up и down, к которому вы можете привязаться, чтобы обновить свой пользовательский интерфейс.


вы можете имитировать команду Ping.

используйте Ajax для запроса метки времени на свой собственный сервер, определите таймер с помощью setTimeout до 5 секунд, если ответа нет, повторите попытку.

Если нет ответа в 4 попытках, вы можете предположить, что интернет не работает.

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

Это кажется хорошим и чистым решением для меня.


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

Edit: нашел этот скрипт JQuery который делает то,что вы просите, я не тестировал его.


Я написал плагин jQuery для этого. По умолчанию он проверяет текущий URL-адрес (поскольку он уже загружен один раз из интернета) или вы можете указать URL-адрес для использования в качестве аргумента. Всегда делать запрос в Google-не лучшая идея, потому что он заблокирован в разных странах в разное время. Также вы можете быть во власти того, что связь через определенный океан / погодный фронт/политический климат может быть такой день.

http://tomriley.net/blog/archives/111


отправка запросов XHR плохая, потому что она может завершиться ошибкой, если этот конкретный сервер не работает. Вместо этого используйте библиотеку API googles для загрузки кэшированных версий jQuery.

вы можете использовать Googles API для выполнения обратного вызова после загрузки jQuery, и это проверит, был ли jQuery загружен успешно. Что-то вроде кода ниже должно работать:

<script type="text/javascript">
    google.load("jquery");

    // Call this function when the page has been loaded
    function test_connection() {
        if($){
            //jQuery WAS loaded.
        } else {
            //jQuery failed to load.  Grab the local copy.
        }
    }
    google.setOnLoadCallback(test_connection);
</script>

Гугл будет здесь.


У меня есть решение, которое работает здесь, чтобы проверить, существует ли подключение к интернету:

$.ajax({
    url: "http://www.google.com",
    context: document.body,
    error: function(jqXHR, exception) {
        alert('Offline')
    },
    success: function() {
        alert('Online')
    }
})

гораздо более простое решение:

<script language="javascript" src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"></script>

и далее в коде:

var online;
// check whether this function works (online only)
try {
  var x = google.maps.MapTypeId.TERRAIN;
  online = true;
} catch (e) {
  online = false;
}
console.log(online);

когда не в сети скрипт google не будет загружен, что приведет к ошибке, когда будет брошено исключение.