如何使用Javascript检查是否存在互联网连接?这样我可以有一些条件说“在生产过程中使用谷歌缓存版本的JQuery,在开发过程中使用该版本或本地版本,具体取决于互联网连接”。
答案 0 :(得分:253)
针对您具体案例的最佳选择可能是:
在您关闭</body>
标记之前:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>
鉴于您的问题以jQuery为中心,这可能是最简单的方法。
如果您想要更强大的解决方案,可以尝试:
var online = navigator.onLine;
了解有关W3C's spec on offline web apps的更多信息,但请注意,这在现代网络浏览器中效果最佳,使用较旧的网络浏览器可能无法按预期工作,或者根本无法使用。
或者,对您自己的服务器的XHR请求对于测试连接的方法并不是那么糟糕。考虑到其他一个答案表明XHR的故障点太多,如果你的XHR在建立连接时存在缺陷,那么无论如何它在常规使用中也会有缺陷。如果您的站点因任何原因无法访问,那么在同一服务器上运行的其他服务也可能无法访问。这个决定取决于你。
我不建议向其他人的服务提出XHR请求,即使是google.com也是如此。向服务器发出请求,或者根本不发送请求。
对于“在线”的含义似乎存在一些混淆。考虑到互联网是一堆网络,但有时你在VPN上,无法访问互联网“一般”或万维网。公司通常拥有自己的网络,这些网络与其他外部网络的连接有限,因此您可以被视为“在线”。在线只需要您连接到 网络,而不是您尝试连接的服务的可用性和可达性。
要确定是否可以从您的网络访问主机,您可以执行以下操作:
function hostReachable() {
// Handle IE and more capable browsers
var xhr = new ( window.ActiveXObject || XMLHttpRequest )( "Microsoft.XMLHTTP" );
// Open new request as a HEAD to the root hostname with a random param to bust the cache
xhr.open( "HEAD", "//" + window.location.hostname + "/?rand=" + Math.floor((1 + Math.random()) * 0x10000), false );
// Issue request and handle response
try {
xhr.send();
return ( xhr.status >= 200 && (xhr.status < 300 || xhr.status === 304) );
} catch (error) {
return false;
}
}
您还可以在此处找到要点:https://gist.github.com/jpsilvashy/5725579
有关本地实施的详情
有些人评论说,“我总是被归还假”。那是因为您可能正在本地服务器上测试它。无论您向哪个服务器发出请求,您都需要能够响应HEAD请求,当然可以根据需要更改为GET。
答案 1 :(得分:36)
好的,也许游戏有点晚了但是用在线图片查看呢? 我的意思是,OP需要知道他是否需要抓取Google CMD或本地JQ副本,但这并不意味着浏览器无论如何都无法读取Javascript,对吧?
<script>
function doConnectFunction() {
// Grab the GOOGLE CMD
}
function doNotConnectFunction() {
// Grab the LOCAL JQ
}
var i = new Image();
i.onload = doConnectFunction;
i.onerror = doNotConnectFunction;
// CHANGE IMAGE URL TO ANY IMAGE YOU KNOW IS LIVE
i.src = 'http://gfx2.hotmail.com/mail/uxp/w4/m4/pr014/h/s7.png?d=' + escape(Date());
// escape(Date()) is necessary to override possibility of image coming from cache
</script>
只需2美分
答案 2 :(得分:13)
5年后 - 版本:
今天,如果您不想深入了解本页所述不同方法的细节,那么有适合您的JS库。
这些是https://github.com/hubspot/offline。它会检查预定义URI的连接,默认情况下是您的favicon。它会自动检测用户连接何时重新建立,并提供up
和down
之类的整洁事件,您可以绑定这些事件以更新UI。
答案 3 :(得分:5)
您可以模仿Ping命令。
使用Ajax向您自己的服务器请求时间戳,使用setTimeout将计时器定义为5秒,如果没有响应则再次尝试。
如果4次尝试没有响应,您可以认为互联网已关闭。
因此,您可以定期检查此例程,例如1或3分钟。
这对我来说似乎是一个很好的清洁解决方案。
答案 4 :(得分:1)
您可以尝试发送XHR请求几次,然后如果您收到错误,则表示互联网连接存在问题。
编辑: 我发现this JQuery script正在做你要求的事情,但我没有测试过。
答案 5 :(得分:0)
我为此做了一个jQuery插件。默认情况下,它会检查当前URL(因为它已经从Web加载过一次),或者您可以指定用作参数的URL。始终向Google提出请求不是最好的主意,因为它在不同时间在不同国家/地区被屏蔽。此外,您可能会受到特定海洋/天气预报/政治气候与当天的联系的影响。
答案 6 :(得分:-3)
发送XHR请求很糟糕,因为如果特定服务器关闭,它可能会失败。相反,使用googles API库来加载jQuery的缓存版本。
您可以使用googles API在加载jQuery后执行回调,这将检查jQuery是否已成功加载。类似下面的代码应该有效:
<script type="text/javascript">
google.load("jquery");
// Call this function when the page has been loaded
function test_connection() {
if($){
//jQuery WAS loaded.
} else {
//jQuery failed to load. Grab the local copy.
}
}
google.setOnLoadCallback(test_connection);
</script>
可以找到google API文档here。
答案 7 :(得分:-3)
我有一个解决方案谁在这里工作,检查是否存在互联网连接:
$.ajax({
url: "http://www.google.com",
context: document.body,
error: function(jqXHR, exception) {
alert('Offline')
},
success: function() {
alert('Online')
}
})
答案 8 :(得分:-7)
一个更简单的解决方案:
<script language="javascript" src="http://maps.google.com/maps/api/js?v=3.2&sensor=false"></script>
以及稍后的代码:
var online;
// check whether this function works (online only)
try {
var x = google.maps.MapTypeId.TERRAIN;
online = true;
} catch (e) {
online = false;
}
console.log(online);
如果不在线,则不会加载Google脚本,从而导致出现异常错误。