我正在编写一个小型网络应用,并希望在我允许他提交数据之前检查用户连接。
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
不起作用。
你有什么建议吗?
提前致谢!
答案 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时,将不会联系网络 脚本请求远程页面(或知道这样的尝试会 失败),否则必须返回。
由于计算机可能具有网络连接但无法访问互联网,因此它不可靠的问题。