`
zhi道
  • 浏览: 5459 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

html5构建离线web应用

阅读更多

最近在研究html5的一些相关内容,其过程真是苦不堪言,由于被一些东西所吸引着所以也就硬着头皮挺了过来,结果还是有一些收获,相信也有很多初学者正在和我当时一样的痛苦中,所以把一些研究收获写了出来与大家一起分享讨论:

这次主要写的是构建web离线应用,顾名思义离线就是当网络无法连接时也可以做一些简单的操作或者是继续浏览一些网页的一个网站。这个应用至少给我们带来了三个好处:
1、离线状态下访问
2、文件被存储在本地,页面加载速度得到提升
3、只加载被修改的文件,可以降低用户请求对服务器的造成的负载压力
由于目前html5还在draft中所以,支持问题就成了当前最重要的一个话题,下图是目前各大浏览器厂商对html5的支持情况:

 

  

 

说了这么多,可能已经有人迫不及待了,那么现在就让我带你们进入离线应用世界来看一下吧:
第一步:服务器端
首先,你的服务器必须支持html5;由于离线应用包含一个manifest清单文件,此文件的MIME类型 是text/cache-manifest,所以配置服务器端
Tomcat服务器:在tomcat下的conf/web.xml添加一个mime_type 如下:
<mime-mapping>
		<extension>manifest</extension>
		<mime-type>text/cache-manifest</mime-type>
</mime-mapping>
 Apache服务器:Apache 中可在 .htaccess 中添加:

AddType text/cache-manifest manifest

第二步:给html元素添加manifest特性:

 

<html manifest="path/myApplication.manifest">

 第三步:编写manifest文件myApplication.manifest:

 

manifest文件第一行必须是CACHE MANIFEST其次是其它标记
CACHE标记:直接要缓存的文件
NETWORK标记:需要在线访问的文件
FALLBACK标记:当没有响应的页面,如:当请求某个页面时,而此页面服务器不在正常工作中,那么可 以显示一个指定页面 

 

CACHE MANIFEST
#VERSION 10.0

#直接缓存文件
CACHE:
applicationCache.jsp
js/offline.js
js/jquery-1.4.1.min.js
#图片文件
images/1.jpg
images/2.jpg

#需要在线的文件
NETWORK:
formapi.jsp

#替代方案
FALLBACK:
index.jsp

 第四步:编写功能代码:

 

jsp文件:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html manifest="myApplication.manifest">
<head>
 

<script type="text/javascript" src="js/jquery-1.4.1.min.js"></script>
 <script type="text/javascript" src="js/offline.js"></script>
<script>
	
 	
</script>
<style>
	
</style>
 
</head>
    <body>
    	
    	<header>Offline Example</header>
    	<section>
    		<img src="images/1.jpg" />
    		<article>
    			<button id="switchButton">切换</button>
    			<button id="installButton">缓存</button>
    			<h3>Log</h3>
    			*****start 离线应用进程列表 开始start*****
    			<div id="info">
    				
    			</div>
    			*****end 离线应用进程列表结束 end*****
    		</article>
    	</section>
    </body>
</html>
  js文件:要写js文件就涉及到了applicatioCache API操作应用缓存的接口。新的window.applicationCache对象可触发一系列缓存状态相关事件,该对象有一个status属性为数值型代表了缓存的状态,该状态共有6种:
缓存状态  数值属性
 UNCACHED(未缓存)
 IDLE(空闲) 1
 CHECKING(检查中) 2
 DOWNLOADING(下载中) 3
 UPDATEREADY(更新就绪) 4
 OBSOLETE(过期) 5
目前由于大多数网页都没有缓存,所以都处于UNCACHED状态,而IDLE代表所有资源都已被浏览器缓存,当前不需要更新,如果缓存曾经有效但现在manifest文件丢失怎进入OBSOLETE(过期)状态
对于以上各种状态相应会触发相应的事件:
 事件 关联的缓存状态 
onchecking   CHECKING
ondownloading  DOWNLOADING
onupdateready  UPDATEREADY
onobsolete  OBSOLETE
oncached  IDLE
此外还有一些事件:
onerror:更新时发生错误
onprogress:更新进程
onnoupdate:没有可用更新
ononline:往前网络连接
onoffline:当前网络中断
下面将为大家详细介绍各个事件的触发:如图


 如图所示:
用户第一次访问web时,页面首先检查存在缓存文件,如果不存在则是第一次访问触发第一访问相应事件,否则触发不是第一次访问的相应事件。需要注意的是,当访问web缓存文件已经存在时(即已经不是第一次访问此web)并且有更新时所触发的完成事件是onupdateready事件而不是oncached事件。
此外,applicationCache api还为我们提供了ononline/onoffline事件这个个事件是当计算当前连接和中断时触发。相应也有window.navigator.online和window.navigator.offline两个布尔属性来检测当前网络的连接状况。applicationCache的事件就已经结束了,接下来我们讨论一下缓存更新的问题。

当web已经被缓存后,下一次访问浏览器首先检测是否存在缓存文件,如果存在直接到缓存中获取文件完成后向服务器发送一个请求来检测服务器端是否有更新,如果有更新则更新相应的缓存文件。
说道更新这里有个小插曲,当我们将页面或js文件等内容更新后无论你怎么狂刷浏览器或无数次的清除缓存页面都没有被更新,这是为什么呢,原因在于浏览器缓存文件只与manifest文件比对,只有当manifest文件更新时缓存文件才会更新,所以通常给manife文件加上一个版本号,当文件无改动时,只需更改一下相依的版本号就可以了。
js文件相应代码:
var n=1;
window.applicationCache.onprogress=function(e){
	$("#info").append("<br/>Resource loading..."+n);
	n++;
}
window.applicationCache.oncached=function(e){
	$("#info").append("<br/>oncached");
}
window.applicationCache.onchecking=function(e){
	$("#info").append("<br/>onchecking");
}
window.applicationCache.onnoupdate=function(e){
	$("#info").append("<br/>onnoupdate");
}
window.applicationCache.onupdateready=function(e){
	$("#info").append("<br/>onupdateready");
}
window.applicationCache.onobsolete=function(e){
	$("#info").append("<br/>onobsolete");
}
window.applicationCache.ondownloading=function(e){
	$("#info").append("<br/>ondownloading");
}

window.applicationCache.onerror=function(e){
	$("#info").append("<br/>onerror");
}
window.addEventListener("online",function(){
	alert("在线");
},true);
window.addEventListener("offline",function(){
	alert("离线");
},true);
$(function(){
showCacheStatus=function(n){
	statusMessage=["Uncache","Idle","Checking","Downloading","Update Ready","Obsolete"];
	return statusMessage[n];
}
$("#installButton").click(function(e){
	try{
		window.applicationCache.update();
	}catch(e){
		alert("更新错误!")
	}
});
window.onload=function(e){
	if(!window.applicationCache){
		alert("当前浏览器不支持离线缓存");
		return;
	}
	if(!navigator.geolocation){
		alert("当前浏览器不支持位置信息");
	}
	if(!window.localStorage){
		alert("当前浏览器不支持本地存储Storage");
	}
	
	
	cache = window.applicationCache;  
	//返回应用于当前window对象文档的ApplicationCache对象  
	//ache = self.applicationCache;  
	//返回应用于当前shared worker的ApplicationCache对象 [shared worker]  
	//cache.status  
	//返回当前应用的缓存状态,status有五种无符号短整型值的状态:   
	cache.update();  
	//调用当前应用资源下载过程  
	cache.swapCache();  
	//更新到最新的缓存,这个不会使得之前加载的资源突然被重新加载。图片不会重新加载,样式和脚本也不会重新渲染或解析,唯一的变化是在此之后发出请求页面的资源是最新的  
}
$("#switchButton").toggle(function(){
	$("img:first").attr("src","/test/images/2.jpg");
},function(){
	$("img:first").attr("src","/test/images/1.jpg");
});
});//--------ready结束
 更新时applicationCache提供两个更新方法 update()/swapCache()
//调用当前应用资源下载过程
cache.update(); 
 //更新到最新的缓存,这个不会使得之前加载的资源突然被重新加载。图片不会重新加载,样式和
 //本也不会重新渲染或解析,唯一的变化是在此之后发出请求页面的资源是最新的 
cache.swapCache(); 
分享到:
评论
1 楼 lixiansky 2012-11-29  
那个online事件还是没有明白!!!我试着怎么不触发呢!!!   

相关推荐

    基于FLEX技术构建可离线Web应用程序的研究与实现.pdf

    构建离线Web应用程序的关键在于数据的本地存储与同步。在FLEX技术的框架下,可以利用其内置的数据存储机制,如Local Storage和Isolated Storage,来实现在用户设备上的数据缓存。这样,即使在网络离线状态下,应用...

    HTML5程序设计-3期(KC014) 离线web应用教学单元设计.doc

    6. **离线Web应用实例**:通过实际的项目练习,学生将学习如何结合HTML5的Geolocation API(用于获取设备地理位置)和其他离线存储技术,构建一个即使在网络不稳定或无网络时仍能运行的应用,例如记录跑步轨迹的应用...

    HTML5离线应用

    HTML5离线应用是现代网页开发中的一个重要特性,它允许用户在没有网络连接时仍然能够访问和使用某些网站或应用程序。这一功能通过HTML5的离线存储标准实现,包括Application Cache(应用程序缓存)和Service Worker...

    HTML5离线应用实例介绍

    综上所述,HTML5的离线应用技术为开发者提供了丰富的工具和方法来创建可在离线状态下工作的Web应用。无论是移动设备还是桌面环境,都能够从中受益。随着技术的不断发展和完善,相信未来HTML5离线应用将在更多领域...

    《apache2下部署的配置离线应用搭建及html5离线应用流程介绍 》附件

    HTML5离线应用(也称为离线存储或离线Web应用)是利用HTML5的离线存储功能,使得Web应用可以在没有网络连接时仍然能够运行。关键技术包括App Cache、Service Worker和IndexedDB等。 1. App Cache:是早期的离线存储...

    html5 离线应用

    总结来说,HTML5离线应用借助Application Cache和Service Worker,让Web应用能够脱离网络环境独立运行,提高了用户体验,特别是在移动设备上。理解并熟练运用这些技术,对于提升Web应用的可用性和用户满意度至关重要...

    HTML5新特性-离线功能应用.pdf

    通过以上讲解,我们可以理解HTML5离线功能如何通过离线资源缓存、在线状态检测和本地数据存储来构建离线Web应用。开发者可以通过创建`cachemanifest`文件,结合`navigator.onLine`等API,以及利用DOM Storage和...

    HTML5离线数据库

    HTML5离线数据库的引入极大地提升了Web应用的离线体验,开发者可以利用这一特性来提升应用的性能和可用性,同时需要关注其潜在的安全性和兼容性问题。通过结合服务器端的同步机制,可以构建出更加健壮和用户友好的...

    使用 HTML 5 支持移动 Web 应用程序离线工作

    构建离线 Web 应用的步骤通常包括以下几个阶段: 1. **定义离线缓存策略**:根据应用需求,决定使用 AppCache 还是 IndexedDB,或者两者结合。编写清单文件(对于 AppCache)或设计数据库结构(对于 IndexedDB)。 ...

    HTML5新特性-离线功能应用.docx

    虽然HTML5标准仍在不断发展,但大多数现代浏览器已经支持离线存储和相关功能,使得开发离线Web应用成为可能。对于需要提高用户体验和应用可用性的开发者来说,理解和掌握HTML5的离线功能至关重要。通过这些技术,...

    HTML5离线存储

    我通过Application Cache+localStorage+web sql构建了一个离线应用,同时我也把逻辑按照Application cache+localStorage+indexedDB写了一次,有兴趣的同学可以下载,同时代码逻辑按照MVC组织。可以让大家很快理解...

    HTML-离线中文手册

    在这个"HTML-离线中文手册"中,包含了一些关于HTML的重要资源,特别是与HTML5相关的知识。 首先,W3CSchool是一个全球知名的在线学习平台,提供各种Web技术的教程,包括HTML。在W3CSchool的HTML部分,你可以找到从...

    Remember先进的离线Todo应用程序

    通过分析Remember的源代码,开发者可以深入理解如何构建离线优先的Web应用,学习到JavaScript的模块化编程、数据持久化策略、离线存储API的使用,以及如何通过Service Worker优化用户体验。这对于想要提升JavaScript...

    webpy离线包

    WSGI(Web Server Gateway Interface)是Python Web应用的标准接口,使得WebPy应用可以部署在任何兼容WSGI的服务器上,如Gunicorn或uWSGI。 离线安装WebPy时,需要注意以下步骤: 1. **下载离线包**:首先,你需要...

    SketchCode一个类似于JSFiddleCodePenJSBin离线桌面应用

    《SketchCode:构建离线版JSFiddle、CodePen与JSBin的桌面应用》 SketchCode,正如其名,是一款灵感来源于在线代码编辑器JSFiddle、CodePen和JSBin的离线桌面应用。它利用现代Web技术栈,特别是Vue.js和Electron...

    使用HTML5结合Vuejs开发离线记事本webapp项目源码

    在本项目中,“使用HTML5结合Vuejs开发离线记事本webapp”是一个现代Web应用程序的实例,它利用了HTML5的新特性以及Vue.js框架的优势。以下是该项目涉及的主要知识点和详细说明: 1. **HTML5**: HTML5是超文本标记...

    html5 css3 离线包

    通过深入学习和掌握HTML5和CSS3,开发者可以构建出更加先进、互动性强且符合现代设计趋势的网页应用。这个离线包提供了一手的参考资料,是开发者提升技能、解决问题的得力助手。无论是初学者还是经验丰富的开发者,...

    Google离线地图,通过demo.html可以直接打开

    4. **构建离线地图应用**:在"demo.html"中,你需要编写JavaScript代码来处理地图显示。当检测到网络不可用时,应用应从本地存储读取地图瓦片并显示。同时,当网络恢复时,应用需要能够更新地图,以保持与Google ...

Global site tag (gtag.js) - Google Analytics