检查是否连接到网络;jQuery
我搜索了StackOverflow,看到了关于如何实现这一点的各种主题,但没有任何真正与我的具体情况相关的内容。我正在(为一个类)编写一个移动“应用程序”(使用HTML5、CSS、jQuery)。它最终将成为一个独立的“应用程序”,它将包含所有所需文件的本地副本。在我的一个页面上,我有一个提交表单,由于用户脱机时无法提交表单,我希望该页面重定向到自定义404页面 我只是想看看是否有办法在jQuery中实现这一点,因为我还没有真正找到任何方法 谢谢您可以使用检查是否连接到网络;jQuery,jquery,html,Jquery,Html,我搜索了StackOverflow,看到了关于如何实现这一点的各种主题,但没有任何真正与我的具体情况相关的内容。我正在(为一个类)编写一个移动“应用程序”(使用HTML5、CSS、jQuery)。它最终将成为一个独立的“应用程序”,它将包含所有所需文件的本地副本。在我的一个页面上,我有一个提交表单,由于用户脱机时无法提交表单,我希望该页面重定向到自定义404页面 我只是想看看是否有办法在jQuery中实现这一点,因为我还没有真正找到任何方法 谢谢您可以使用 if (navigator.onLin
if (navigator.onLine) {
// I'm online so submit the form.
}
您可以检查
navigator.onLine
属性,也可以收听离线
/在线
事件:
$(document).on('offline online', function (event) {
alert('You are ' + event.type + '!');
});
资料来源:
以下是这些活动的一些MDN文档:
我自己对这些事件并不熟悉,但如果您阅读上述链接,您会发现很多好信息。以下是我将要做的,基于: 首先,使用javascript库链接确定用户是否在线。如果为true,请将窗体的操作属性更改为联机页,否则更改为脱机页
<script src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js></script>
<script>
$('#target').submit(function() {
if (typeof window.$ !== 'function') {
$('myform').attr( "action" , "offlinepage.html" );
}
else
{
$('myform').attr( "action" , "onlinepage.html" );
}
});
</script>
实际上,您根本不需要jQuery。HTML5本身有一个整洁的设施,用于在在线/离线条件下运行的应用程序。缓存清单是在
标记的清单
属性中引用的纯文本文件:
<html manifest="cache.manifest">
在使用清单时,浏览器首先查阅清单,在不编写任何脚本的情况下,根据在线或离线情况采取相应的行动
更新:
请注意响应内容类型的关键要求。纯文本根本不起作用
必须使用文本/缓存清单
MIME类型提供清单
还要注意,清单中未列出的所有URL都会因此被阻止加载。这就是为什么我用通配符(*
)修复了上面的清单,以允许“其余的”。这可能会帮助您开始。尝试将ajaxSetup设置为每n毫秒执行一次请求(我在这里输入1000),并检查它是否超时,然后禁用按钮
$.ajaxSetup({
timeout: 1000,
error: function(request, status, maybe_an_exception_object) {
if(status != 'timeout')
//Code to enable button
else
//Code to disable button
}
});
使用window.navigator.onLine
本身是不可靠的,因为用户可能已连接到网络,但该网络无法访问internet
然而,这里有一个简单的例子
<!DOCTYPE HTML>
<html>
<head>
<title>Online status</title>
<script>
function updateIndicator() {
document.getElementById('indicator').textContent = navigator.onLine ? 'online' : 'offline';
}
</script>
</head>
<body onload="updateIndicator()" ononline="updateIndicator()" onoffline="updateIndicator()">
<p>The network is: <span id="indicator">(state unknown)</span>
</body>
</html>
在线状态
函数updateIndicator(){
document.getElementById('indicator')。textContent=navigator.onLine?'onLine':'offline';
}
网络为:(状态未知)
查看小提琴的动作:我正在使用以下代码检查连接。注意:上述解决方案均不适用于Firefox,Firefox依赖于其内部“脱机工作”状态:
// Register listeners
window.addEventListener("offline", function(){
$('#globalDiv').hide();
$("#message").html('WARNING: Internet connection has been lost.').show();
});
window.addEventListener("online", function(){
$("#message").empty().hide();
$('#globalDiv').show();
});
我按你说的做了;在if/else中发出警报。如果我禁用我的网络连接来测试else,if会像我预期的那样完美工作,它会失败,并且仍然显示if语句中显示的内容。它不是傻瓜式的,它从浏览器中获取数据。它只显示您是否处于脱机
模式,我正在寻找一种方法来检查您是否可以访问internet。这看起来是一种干净的方法,但是这些事件在所有浏览器中都有效吗?绝对不是:)。这是使用HTML5特定事件,这还不是官方规范。这里是指向MDN站点的链接,用于navigator.onLine
:(浏览器支持位于底部)@ToddMoses我必须测试它以确保它有效,但Todd Moses的答案似乎是一个很好的答案。但是您可以使用一个小的资源来加载,而不是整个框架。例如,您可以托管自己的JS文件,该文件只向全局范围添加一个标志,如果该标志存在,则用户处于联机状态。为了确保JS文件没有被缓存,你必须正确地设置文件的标题,使其始终刷新。有趣的是……这可能就是我所寻找的……假设我有5个网页(index.html、contact.html、about.html、rates.html、reserve.html),并且无论发生什么情况,索引都将与about页面一起显示。当我离线时,我想链接到自定义404页面的联系人、预订和费率;我该怎么做呢?我给了你奖金,因为即使我无法让你的解决方案在我的普通浏览器上运行,我相信如果我严格为移动设备编码,这是一个好办法。@Brendan,缓存清单也在普通桌面浏览器上运行,并且以同样的方式运行。我用公共内容类型gotcha再次更新了答案,因为我最近发现,缓存清单的行为基本上类似于防火墙,您必须告诉防火墙实际允许哪些网络资源,我使用了通配符来允许您的所有资源,否则它们将被阻止。您只需选择要缓存的其中一个,并将其列在清单中。@vishwanath刚刚进行了双重检查,所有三个链接都正常工作。哎呀,一段时间后它会进行一些重定向,我没有等那么久。谢谢你的回复。当你有很多客户时,这可能会导致一些严重的连接开销。对一个3年前有效的答案投了反对票。:)截至2015年,如果您希望使用简单事件,此答案似乎是最可靠的。在没有网络连接的情况下浏览页面时,如何在每个页面中重新初始化此答案。这是工作,但我需要允许通过网页导航是否有网络。此外,我需要在每个页面中显示“无网络”消息。您可以在页面顶部显示“无网络”消息作为横幅,而不是阻止整个页面,但在没有网络时允许导航是另一个主题。为此,您需要在本地缓存页面。HTML5对此有一个机制(缓存清单),请参考以下内容:
// Register listeners
window.addEventListener("offline", function(){
$('#globalDiv').hide();
$("#message").html('WARNING: Internet connection has been lost.').show();
});
window.addEventListener("online", function(){
$("#message").empty().hide();
$('#globalDiv').show();
});