我有一个Web应用程序,其中有许多Ajax组件在页面内经常刷新(它是各种各样的仪表板)。
现在,我想为页面添加功能,以便在没有Internet连接时,页面的当前内容不会更改,并且页面上会显示一条消息,指出页面处于脱机状态(当前,页面上的各种小工具尝试刷新自己,发现没有连接,他们的旧数据消失了。
那么,最好的方法是什么?
答案 0 :(得分:12)
navigator.onLine
那应该做你要问的事。
您可能想要检查更新页面的任何代码。例如:
if (navigator.onLine) {
updatePage();
} else {
displayOfflineWarning();
}
答案 1 :(得分:4)
好像你已经回答了自己的问题。如果小工具发送异步请求并且超时,请不要更新它们。如果足够多,则显示“页面离线”消息。
答案 2 :(得分:4)
见the HTML 5 draft specification。你想要navigator.onLine
。并非所有浏览器都支持它。 Firefox 3和Opera 9.5可以。
听起来好像是在试图掩盖问题而不是解决问题。如果失败的请求导致您的小部件清除其数据,那么您应该修复您的代码,以便它不会尝试更新您的小部件,除非它收到响应,而不是试图弄清楚请求是否会提前成功。
答案 3 :(得分:3)
处理此问题的一种方法可能是使用显式超时方法扩展XmlHTTPRequest对象,然后使用它来确定您是否在脱机模式下工作(即,对于不支持navigator.onLine的浏览器)。以下是我在一个站点(使用Prototype库的站点)上实现Ajax超时的方法。 10秒(10,000毫秒)后,它将中止调用并调用onFailure方法。
/**
* Monitor AJAX requests for timeouts
* Based on the script here: http://codejanitor.com/wp/2006/03/23/ajax-timeouts-with-prototype/
*
* Usage: If an AJAX call takes more than the designated amount of time to return, we call the onFailure
* method (if it exists), passing an error code to the function.
*
*/
var xhr = {
errorCode: 'timeout',
callInProgress: function (xmlhttp) {
switch (xmlhttp.readyState) {
case 1: case 2: case 3:
return true;
// Case 4 and 0
default:
return false;
}
}
};
// Register global responders that will occur on all AJAX requests
Ajax.Responders.register({
onCreate: function (request) {
request.timeoutId = window.setTimeout(function () {
// If we have hit the timeout and the AJAX request is active, abort it and let the user know
if (xhr.callInProgress(request.transport)) {
var parameters = request.options.parameters;
request.transport.abort();
// Run the onFailure method if we set one up when creating the AJAX object
if (request.options.onFailure) {
request.options.onFailure(request.transport, xhr.errorCode, parameters);
}
}
},
// 10 seconds
10000);
},
onComplete: function (request) {
// Clear the timeout, the request completed ok
window.clearTimeout(request.timeoutId);
}
});
答案 4 :(得分:2)
答案 5 :(得分:2)
拨打一个可靠的目的地,或者可能是一系列电话,如果用户有一个有效的网络连接则应该通过并返回 - 即使像对谷歌,雅虎和MSN的令牌ping一样简单,或类似的东西。如果至少有一个回绿,你知道你已经连接了。
答案 6 :(得分:1)
我认为谷歌齿轮有这样的功能,也许你可以检查他们是如何做到的。
答案 7 :(得分:1)
使用相关的HTML5 API:online/offline status/events。
答案 8 :(得分:0)
感谢所有回复。我将尝试用我最终做的事情来更新问题。
答案 9 :(得分:0)
一种可能的解决方案是,如果页面和缓存页面具有不同的URL,只需查看并查看您所在的URL。如果您在缓存页面的URL上,则表示您处于脱机模式。 This博客对于navigator.online崩溃的原因提出了一个很好的观点