如何检查用户连接?

时间:2011-11-03 10:03:13

标签: javascript ajax timeout xmlhttprequest

我正在编写一个小型网络应用,并希望在我允许他提交数据之前检查用户连接。

      function testConnection() {
       var xmlhttp;

       document.getElementById("checkingConnectivity").style.display = "block";

       if (window.XMLHttpRequest) {    // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
       } else {                        // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
       }

       var success = false;

       xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
         document.getElementById("noConnectivity").style.display = "none";
         document.getElementById("checkingConnectivity").style.display = "none";
         success = true;
        }
       }

       connIterator = connIterator + 1;
       xmlhttp.open("GET","testConnection.jsp?i="+connIterator,true); // Dynamic URL to prevent caching
       xmlhttp.send();

       // Wait 10 seconds
       for(var i = 0; i < 10; i++) {
        // If no success so far, keep waiting
        if(!success) {
         window.setTimeout('1000');
        } else {
         return true;
        }
       }

       // success still isn't true, so we assume a timeout
       document.getElementById("noConnectivity").style.display = "block";
       document.getElementById("checkingConnectivity").style.display = "none";
       return false;
      }

问题是即使文件可以访问,此函数也总是返回false。 在window.setTimeout('1000');之前添加提醒时,我会假设setTimeout不起作用。

你有什么建议吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您的功能在检查完成之前返回。请记住,JavaScript是事件驱动的。这是一个潜在的修复(未经测试):

// when connected, call the callback
function testConnection(callback) {
 var xmlhttp;

 document.getElementById("checkingConnectivity").style.display = "block";

 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==200) {
    document.getElementById("checkingConnectivity").style.display = "none";
    if (callback) {
      callback(xmlhttp);
    }
  }
 }

 connIterator = connIterator + 1;
 xmlhttp.open("GET","testConnection.jsp?i="+connIterator,true); // Dynamic URL to prevent caching
 xmlhttp.send();
}


document.getElementById("noConnectivity").style.display = "block";
document.getElementById("checkingConnectivity").style.display = "none";
testConnection(function() {
  // this code will run when the connection succeeds
  document.getElementById("noConnectivity").style.display = "none";
});

答案 1 :(得分:0)

navigator.onLine。规范说:

  

如果用户代理明确脱机(断开连接),则返回false   来自网络)。如果用户代理可能在线,则返回true。

     

当这个值发生时,会触发在线和离线事件   属性变化。

     

如果用户代理,navigator.onLine属性必须返回false   当用户关注链接或当a时,将不会联系网络   脚本请求远程页面(或知道这样的尝试会   失败),否则必须返回。

由于计算机可能具有网络连接但无法访问互联网,因此它不可靠的问题。