Проверьте, существует ли подключение к интернету с помощью Javascript? [дубликат]
этот вопрос уже есть ответ здесь:
Как проверить, есть ли подключение к интернету с помощью Javascript? Таким образом, у меня могут быть некоторые условные выражения: "используйте кэшированную версию jQuery google во время производства, используйте либо это, либо локальную версия во время разработки, в зависимости от подключения к интернету".
9 ответов:
лучший вариант для вашего конкретного случая может быть:
прямо перед вашим закрытием
</body>- тег:<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
информация о реализации
некоторые люди прокомментировали:"мне всегда возвращают ложь". Это потому, что вы, вероятно, тестируете его на своем локальном сервере. Независимо от того, на какой сервер вы делаете запрос, вам нужно будет ответить на запрос HEAD, который, конечно же, можно изменить на GET, если вы хотите.
хорошо, может быть, немного поздно в игре, но как насчет проверки с онлайн-изображением? Я имею в виду, что OP должен знать, нужно ли ему захватить Google CMD или локальную копию 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, по умолчанию ваш фавикон. Он автоматически определяет, когда подключение пользователя было восстановлено и обеспечивает аккуратные события, такие как
upиdown, к которому вы можете привязаться, чтобы обновить свой пользовательский интерфейс.
вы можете имитировать команду Ping.
используйте Ajax для запроса метки времени на свой собственный сервер, определите таймер с помощью setTimeout до 5 секунд, если нет ответа, попробуйте еще раз.
Если нет ответа в 4 попытки, вы можете предположить, что интернет не работает.
таким образом, вы можете проверить с помощью этой процедуры через регулярные промежутки времени, как 1 или 3 минуты.
Это кажется хорошим и чистым решением для меня.
вы можете попробовать, отправив запросы XHR несколько раз, а затем, если вы получаете ошибки, это означает, что есть проблема с подключением к интернету.
Edit:
нашел этот скрипт JQuery который делает то, что вы просите, я не проверял его, Хотя.
Я написал плагин jQuery для этого. По умолчанию он проверяет текущий URL-адрес (потому что он уже загружен один раз из интернета), или вы можете указать URL-адрес для использования в качестве аргумента. Всегда делаю запрос в Google-не самая лучшая идея, потому что он заблокирован в разных странах в разные времена. Также вы можете быть во власти того, что связь через определенный океан / погодный фронт/политический климат может быть такой день.
отправка запросов XHR плохо, потому что это может произойти сбой, если этот конкретный сервер не работает. Вместо этого, используйте API библиотеки гуглит, чтобы загрузить их кэшированная версия(ы) с помощью 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>документация Google API может быть найдена здесь.
У меня есть решение, которое работает здесь, чтобы проверить, существует ли подключение к интернету:
$.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 не будет загружен, что приводит к ошибке, где будет выдано исключение.
Comments