1

我想了解它是如何navigator.onLine工作的。为此,我输入了一个小片段,它应该每 3 秒检查一次浏览器是否在线,如果在线,则弹出一个警报:

function check_connection() {
var online = navigator.onLine;
return online;
}

function timed_alert() {

var perfectTiming = setInterval(check_connection,3000);

if (online) {
alert("ONLINE!");
clearInterval(perfectTiming);
}

timed_alert();

由于某种原因,这件事不起作用。我做错了什么?我应该在代码段中进行哪些更改才能使其正常工作?

4

4 回答 4

3

您的警报和检查需要在同一个函数中,并且计时器 id (perfectTiming) 是全局的。

var perfectTiming = null;
function check_connection() {
     var online = navigator.onLine;
     if (online) {
          alert("ONLINE!");
          clearInterval(perfectTiming);
     }
}

function timed_alert() {
    perfectTiming = setInterval(check_connection,3000);
}

timed_alert();

如果您正在尝试测试用户是否具有更难的活动互联网连接,因为浏览器没有真正的方法来检查这一点。但是,您可以测试几个不同的 ip/url 以查看它们是否可以访问

var testUrlIndex = 0;
var testurls = [
    "http://www.google.com",
    "http://www.cnn.com"
];
function testURL(url)
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==0)
        {
                testUrlIndex++;
            if( testUrlIndex<testurls.length ) {
                testUrl(testurls[testUrlIndex]);
            } else {
                weAppearToBeOffline();
            }
        }
    }
    xmlhttp.open("GET",url,true);
    xmlhttp.send();
}

function weAppearToBeOffline() {
     //DO whatever you need to do if we are offline.
}
testUrl(testurls[0]); //start the check

此代码将检查 2 个 url(testurls如果您想检查更多,只需添加更多 url),如果它通过所有这些并且无法访问它们,它将调用该weAppearToBeOffline函数

现在这只是在几个方面有问题,一个主要是存在这样一种情况,即用户可能在线但无法访问这些网址中的任何一个,但可以访问其他网址。

于 2013-06-27T13:16:28.143 回答
2

进行以下更改:

var perfectTiming = setInterval(check_connection,3000);

function check_connection() {    
  if(navigator.onLine){
      alert("ONLINE!");
      clearInterval(perfectTiming);
  }
}
于 2013-06-27T13:15:17.480 回答
2

您需要使用 setTimeout 而不是 check_connection 调用 timed_alert。

function check_connection() {
    var online = navigator.onLine;
    return online;
}

function timed_alert() {
    var online  =check_connection();


    if (online) {
       alert("ONLINE!");

    }
    else{

       setTimeout(timed_alert,3000);
    }
}
timed_alert();
于 2013-06-27T13:16:35.467 回答
2

您每 3 秒检查一次连接,但您什么也没做。timed_alert改为每 3 秒调用一次并check_connection在该函数中使用:

var perfectTiming = setInterval(timed_alert,3000);

function check_connection() {
    var online = navigator.onLine;
    return online;
}

function timed_alert() {
    if (check_connection()) {
        alert("ONLINE!");
        clearInterval(perfectTiming);
    }
}

check_connection如果您计划在脚本中的其他地方使用,这是要采取的路线。

于 2013-06-27T13:18:25.590 回答