在线时发送警报

Send alert when online

本文关键字:在线      更新时间:2023-09-26

我想了解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();

出于某种原因,这东西不起作用。我做错了什么?我应该更改代码段中的哪些内容才能使其正常工作?

您的警报和检查需要在同一个函数中,并且计时器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/urls,看看它们是否可以访问

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),如果它通过了所有URL,但无法到达它们,它将调用weAppearToBeOffline函数

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

您需要使用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();

您每3秒检查一次连接,但没有对此执行任何操作。请改为每3秒调用timed_alert,并在该函数中使用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,则可以采用此路线。

进行以下更改:

var perfectTiming = setInterval(check_connection,3000);
function check_connection() {    
  if(navigator.onLine){
      alert("ONLINE!");
      clearInterval(perfectTiming);
  }
}