Проверьте подключение к интернету с помощью jquery
Я пытаюсь проверить подключение к интернету, отправив запрос GET на сервер. Я новичок в jQuery и JavaScript. Я не использую navigator.onLine
мой код, как он работает по-разному в разных браузерах. Это мой код до сих пор:
var check_connectivity={
is_internet_connected : function(){
var dfd = new $.Deferred();
$.get("/app/check_connectivity/")
.done(function(resp){
return dfd.resolve();
})
.fail(function(resp){
return dfd.reject(resp);
})
return dfd.promise();
},
}
Я называю этот код в другой файл в виде:
if(!this.internet_connected())
{
console.log("internet not connected");
//Perform actions
}
internet_connected : function(){
return check_connectivity.is_internet_connected();
},
на is_internet_connected()
функция возвращает отложенный объект, тогда как мне просто нужен ответ в true/false. Кто-нибудь может рассказать мне, как этого достичь?
5 ответов
$.get()
возвращает объект jqXHR, который совместим с promise - поэтому нет необходимости создавать свой собственный $.Deferred
.
var check_connectivity = {
...
is_internet_connected: function() {
return $.get({
url: "/app/check_connectivity/",
dataType: 'text',
cache: false
});
},
...
};
затем :
check_connectivity.is_internet_connected().done(function() {
//The resource is accessible - you are **probably** online.
}).fail(function(jqXHR, textStatus, errorThrown) {
//Something went wrong. Test textStatus/errorThrown to find out what. You may be offline.
});
как вы можете видеть, невозможно быть окончательным о том, находитесь ли вы в сети или в автономном режиме. Все javascript / jQuery знает, Был ли успешно получен доступ к ресурсу или нет.
в общем, более полезно знать, был ли успешно получен доступ к ресурсу (и что ответ был прохладным), чем к знайте о своем онлайн-статусе per se. Каждый вызов ajax может (и должен) иметь свой .done()
и .fail()
филиалы, позволяющие принимать соответствующие меры независимо от результата запроса.
вы хотите проверить подключение к интернету, если оно подключено?
если да, попробуйте следующее:
$.ajax({
url: "url.php",
timeout: 10000,
error: function(jqXHR) {
if(jqXHR.status==0) {
alert(" fail to connect, please check your connection settings");
}
},
success: function() {
alert(" your connection is alright!");
}
});
вы не можете получить простые true или false взамен, дайте им обработчик обратного вызова
function is_internet_connected(callbackhandler)
{
$.get({
url: "/app/check_connectivity/",
success: function(){
callbackhandler(true);
},
error: function(){
callbackhandler(false);
},
dataType: 'text'
});
}
try this
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
if (! window.jQuery) {
alert('No internet Connection !!');
}
else {
// internet connected
}
Я просто использую свойство navigator onLine, согласно W3C http://www.w3schools.com/jsref/prop_nav_online.asp
но навигатор говорит нам только, если браузер имеет возможность интернета (подключен к маршрутизатору, 3G или такой). Поэтому, если это возвращает false, вы, вероятно, в автономном режиме, но если это возвращает true, вы все еще можете быть в автономном режиме, если сеть не работает или очень медленно. Это время для проверки запроса XHR.
setInterval(setOnlineStatus(navigator.onLine), 10000);
function setOnlineStatus(online)
{
if (online) {
//Check host reachable only if connected to Router/Wifi/3G...etc
if (hostReachable())
$('#onlineStatus').html('ONLINE').removeAttr('class').addClass('online');
else
$('#onlineStatus').html('OFFLINE').removeAttr('class').addClass('offline');
} else {
$('#onlineStatus').html('OFFLINE').removeAttr('class').addClass('offline');
}
}
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;
}
}
EDIT: используйте номер порта, если он отличается от 80, в противном случае он терпит неудачу.
xhr.open("HEAD", "//" + window.location.hostname + ":" + window.location.port + "/?rand=" + Math.floor((1 + Math.random()) * 0x10000), false);