Javascript 如何抓住薄弱的互联网连接

Javascript 如何抓住薄弱的互联网连接,javascript,Javascript,我遇到的情况是,用户有Wi-Fi连接,但Wi-Fi未连接到Internet 因此navigator.onLine生成了一个真实的,但实际上用户不在线。 除了进行实际的ajax调用外,还有其他指标来判断我们是否在线吗 我似乎记得PhoneGap有一个额外的指示器。类似的东西应该可以工作 window.addEventListener("online", NowOnline, false); window.addEventListener("offline", NowOffline, false);

我遇到的情况是,用户有Wi-Fi连接,但Wi-Fi未连接到Internet

因此navigator.onLine生成了一个真实的,但实际上用户不在线。 除了进行实际的ajax调用外,还有其他指标来判断我们是否在线吗


我似乎记得PhoneGap有一个额外的指示器。

类似的东西应该可以工作

window.addEventListener("online", NowOnline, false);
window.addEventListener("offline", NowOffline, false);
var req = new XMLHttpRequest();
req.open('GET', 'http://www.google.com', false);
req.send(null);
if(req.status == 200)
   alert(req.responseText);

唯一可靠的方法就是尝试去接触一些东西。这可以通过点击你自己网站的一些文件来实现

i_am_online = true;

function connectivity_test()
{
    if (navigator.onLine) // have network, test if can actually reach the server
    {
        $.ajax('/some_static_file.html', { type: 'HEAD', cache: false })
        .done(function() { setTimeout(connectivity_test, 2000); i_am_online = true; })
        .fail(function() { setTimeout(connectivity_test, 2000); i_am_online = false; });
    }
    else // without network I'm offline, no need to ping
    {
        setTimeout(connectivity_test, 2000);
        i_am_online = false;
    }
}

connectivity_test();
这应该每2秒测试一次对等连接,并相应地用
true
false
更新变量
i_am\u online


针对某个静态文件进行测试,以确保不会触发服务器端脚本。方法
HEAD
将只发送头,因此无论文件大小如何,此“ping”都将生成最小的网络流量。

不同的环境/设备将有不同的选项。最好的跨平台解决方案是以设定的间隔ping端点的微弱轮询。如果有几个请求被丢弃,则假定用户处于脱机状态。它将如何检查状态?奇怪的是,我只是指出了作者可能不知道的等式的另一部分。我明白,我的观点是:
“在线”
事件在这种情况下到底意味着什么?在线意味着联网。联网并不意味着你可以访问世界上的每一台服务器。事实上,即使在互联网上,这也不是真的。因此,仅凭定义来检查您是否“在线”可能不是一个令人满意的状态,无法知道您是否可以连接到服务器。在这种情况下,什么是
proxy.php
?OP提到PhoneGapy您无法直接连接到
http://www.google.com
,这是一个跨域的安全限制。你真的只需要一个“头”请求哦!那是个好主意。我开始写一个ajax请求,但是你的想法只是轮询http服务器,而我的想法则需要一直访问数据库。我想知道这种轮询是否会耗尽电池。当在线事件被触发时,将其放入调用的NowOnline函数是否足够?@Phillip Good point。我猜只有在触发
在线/离线
事件侦听器时才能启动此测试。哦,等等。如果事件说它是在线的,而我们的验证说它不是,那么我们将永远不会得到另一个在线事件。所以投票毕竟是必要的。我不会每两秒钟就做一次。