Обнаружить подключение к Интернету в автономном режиме?
Как обнаружить подключение к Интернету в автономном режиме в JavaScript?
16 ответов
вы можете определить, что соединение потеряно, сделав неудачные запросы XHR.
стандартный подход к повторите запрос несколько раз. Если он не пройдет,предупреждения пользователя чтобы проверить соединение, и изящно не.
Sidenote: чтобы поместить все приложение в "автономное" состояние, может привести к большой работе с ошибками состояния обработки.. беспроводные соединения могут прийти и идти, и т. д. Таким образом, лучше всего просто потерпеть неудачу, сохранить данные и предупредить пользователя.. позволяя им в конечном итоге решить проблему подключения, если она есть, и продолжать использовать ваше приложение с достаточным количеством прощения.
Sidenote: вы можете проверить надежный сайт, как google для подключения, но это может быть не совсем полезно, как просто пытается сделать свой собственный запрос, потому что в то время как google может быть доступен, ваше собственное приложение не может быть, и вам все равно придется решать свои проблемы с подключением. Попытка отправить пинг в google была бы хорошим способом подтвердить, что само подключение к интернету не работает, поэтому, если эта информация полезна для вас, то это может стоить проблем.
Sidenote: отправка Ping может быть достигнуто таким же образом, что вы сделали бы любой двусторонний запрос ajax, но отправка пинга в google в этом случае создаст некоторые проблемы. Во-первых, мы имеют те же междоменные проблемы, которые обычно встречаются при создании ajax-коммуникаций. Один из вариантов-настроить серверный прокси, в котором мы фактически ping
google (или любой другой сайт), и вернуть результаты пинга в приложение.. Это Уловка-22, потому что если подключение к интернету на самом деле проблема, мы не сможем добраться до сервера, и если проблема подключения только на нашем собственном домене, мы не сможем сказать разницу. Другие кросс-домена методы можно попробовать, например, встраивание iframe в вашу страницу, которая указывает на google.com, а затем опрос iframe на успех / неудачу (проверьте содержимое и т. д.). Встраивание образа может на самом деле ничего нам не сказать, потому что нам нужен полезный ответ от механизма коммуникации, чтобы сделать хороший вывод о том, что происходит. Таким образом, опять же, определение состояния интернет-соединения в целом может быть больше проблем, чем стоит. Тебе придется взвесить это. параметры для вашего конкретного приложения.
есть несколько способов сделать это:
- AJAX запрос на ваш собственный веб-сайт. Если этот запрос не удастся, есть хороший шанс, что это ошибка соединения. The в jQuery в документации есть раздел обработка неудачных запросов AJAX. Остерегайтесь Та Же Политика Происхождения при этом, что может остановить вас от доступа к сайтам за пределами вашего домена.
-
вы могли бы поставить
onerror
наimg
, как<img src='http://www.example.com/singlepixel.gif' onerror='alert("Connection dead");' />
этот метод также может потерпеть неудачу, если исходное изображение будет перемещено / переименовано и, как правило, будет уступать опции ajax.
таким образом, есть несколько разных способов попытаться обнаружить это, ни один из них не идеален, но в отсутствие возможности выскочить из песочницы браузера и получить доступ к статусу сетевого подключения пользователя напрямую, они кажутся лучшими вариантами.
API кэша приложений HTML5 указывает навигатор.онлайн, который в настоящее время доступен в IE8 betas, WebKit (например. Safari) nightlies, и уже поддерживается в Firefox 3
как olliej сказал, используя 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) - " 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!');
}
}
});
мне пришлось сделать веб-приложение (на основе 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 на основе, asyncronous, так что вы можете проверить, если интернет подключен, не выходя из исходной страницы. Используя это с таймером, вы также можете иметь компонент на странице, проверяющий каждые 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 ответа для двух разных сенариев: -
-
Если вы используете JavaScript на веб-сайте(i.e; или любая передняя часть) Самый простой способ сделать это:
<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>
-
но если вы используете js на стороне сервера(i.e; узел etc.), Вы можете определить, что соединение потеряно, сделав неудачные запросы 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;
}
вы должны использовать это с обнаружением метода, иначе запустите "альтернативный" способ сделать это. Быстро приближается время, когда это будет все, что нужно. Другие методы-хаки.