2015-04-23 73 views
3

我正在使用从中发送数据到服务器的Web应用程序。如果应用程序没有互联网连接,则应禁用发送数据的选项。如果您在线,从浏览器中检查的最快方法是哪一种?我使用了navigator.onLine,但它不可靠,因为不同的浏览器对它的解释不同。我的另一个解决方案是在服务器上放置一些纯文件,并在发送前每次尝试到达它。代码是这样的:从浏览器中检查连接状态的最快方法

function serverReachable() { 
    var x = new XMLHttpRequest(), 
    s; 
    x.open(
    "HEAD", 
    'http://servername/client/keepalive.txt', 
    false 
); 
    try { 
    x.send(); 
    s = x.status; 
    return (s >= 200 && s < 300 || s === 304); 
    } catch (e) { 
    return false; 
    } 
} 

功能serverReachable()做的工作,但有没有更快的方式做到这一点(按时间没有代码量方面更快我的意思是更快)?

回答

1

使用

navigator.onLine 

,以检查是否有尚未上互联网连接,它应该返回真或假。检查你的服务器

+0

navigator.onLine通过浏览器有不同的解释。例如,只要我们将它放在离线模式下,Firefox和IE都将返回false,而不管我们是否连接到网络。 – Onitsuka

+1

是的,你是对的,我建议你做同样的检查发送Ajax到服务器,但不要使用你自己的服务器,使用更快速的CDN服务器作为jQuery或S3/CloudFront,这样你可以得到更快的响应,并且如果服务器停机,请不要担心服务器。 –

0

最快的方法是连接或不就是

尝试访问的任何文件服务器上,就像任何图像。

function doesConnectionExist() { 
    var xhr = new XMLHttpRequest(); 
    var file = "img/a.png"; //image path in your project 
    var randomNum = Math.round(Math.random() * 10000); 
    xhr.open('HEAD', file + "?rand=" + randomNum, false); 
    try { 
     xhr.send(null); 
     if (xhr.status >= 200 && xhr.status < 304) { 
      return true; 
     } else { 
      return false; 
     } 
    } catch (e) { 
     return false; 
    } 
} 

注:拨打这通电话更快,图像(a.png),您要下载应该是很轻;以KB为单位。

+0

@Onistuka,上面的方法不管浏览器!它适用于其中任何一个 – Vikrant

+0

而不是IE8 ......照常。 – Eric

1

我通常会尝试创建一个Image()然后侦听onerror/onload事件。

function isOnline(cb){ 
    var img = new Image(); 
    img.onerror = function() { 
     cb(false) 
    } 
    img.onload = function() { 
     cb(true) 
    } 
    img.src = "http://example.com/some_image.jpg?t=" + (+new Date); 
} 
isOnline(function(res){ 
    if (res) { 
     // yup! 
    } else { 
     // nope 
    } 
}); 

然而,这很可能是在引擎盖下,与制作XHR请求完全一样。你将不得不小窍门,看看最适合你的是什么!

编辑:添加时间戳来强制非缓存版本。

+1

可能应该使用缓存断路器,因为它是一个获取请求 – epascarello

+0

只需添加:如果您想真正保存字节,只能提供最小的图像。使用MS Paint可以得到的最小有效图像是保存为24位BMP的1x1黑色方块,重量为58字节。 – Scott

相关问题