我正在编写一个小的web应用程序,想在允许用户提交数据之前检查用户的连接。
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
不工作。
你有什么建议吗?
提前感谢!
您的函数在检查完成之前返回。记住,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";
});
有navigator.onLine
。规范说:
如果用户代理确定脱机(已断开连接)则返回false从网络)。如果用户代理可能在线,则返回true。
当this的值为时触发在线和离线事件属性改变。
navigator。属性必须返回false,如果用户代理会不会联系网络当用户跟随链接或者当一个脚本请求一个远程页面(或者知道这样的尝试将会失败)失败),否则必须返回true。
问题在于它不那么可靠,因为计算机可能有网络连接,但不能访问internet。