使用 HTML5,经过建立 cache manifest 文件,能够轻松地建立 web 应用的离线版本。javascript
HTML5引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网链接时进行访问。 应用程序缓存为应用带来三个优点:css
- 离线浏览 - 用户可在应用离线时使用它们
- 速度 - 已缓存资源加载得更快
- 减小服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。
<html manifest="manifest.appcache"> ... </html>
manifest
属性可指向绝对网址或相对路径,但绝对网址必须与相应的网络应用同源。清单文件可以使用任何文件扩展名,但必须以正确的 MIME 类型提供text/cache-manifest
。html
CACHE MANIFEST # update on:2016-06-15 23:22:23 v2 # Explicitly cached 'master entries'. CACHE: /favicon.ico stylesheet.css images/logo.png scripts/main.js # Resources that require the user to be online. NETWORK: * http://api.twitter.com # offline.jpg will be served in place of all images in images/large/ # offline.html will be served in place of all other .html files FALLBACK: images/large/ images/offline.jpg *.html /offline.html
以“#”开头的行是注释行。html5
CACHE MANIFEST
字符串应在第一行,且必不可少。java
CACHE
:web这是条目的默认部分。系统会在首次下载此标头下列出的文件(或紧跟在
CACHE MANIFEST
后的文件)后显式缓存这些文件。编程
NETWORK
:api此部分下列出的文件是须要链接到服务器的白名单资源。不管用户是否处于离线状态,对这些资源的全部请求都会绕过缓存。可以使用通配符(*)。浏览器
FALLBACK
:缓存此部分是可选的,用于指定没法访问资源时的后备网页。其中第一个 URI 表明资源,第二个表明后备网页。两个 URI 必须相关,而且必须与清单文件同源。可以使用通配符。
请注意:这些部分可按任意顺序排列,且每一个部分都可在同一清单中重复出现。
用户清除了浏览器对您网站的数据存储。
清单文件通过修改。请注意:更新清单中列出的某个文件并不意味着浏览器会从新缓存该资源。清单文件自己必须进行更改。
应用缓存经过编程方式进行更新。
var appCache = window.applicationCache;//浏览器的应用缓存对象 appCache.update(); // Attempt to update the user's cache. switch (appCache.status) {//缓存的当前状态 case appCache.UNCACHED: // UNCACHED == 0 console.log('UNCACHED');; break; case appCache.IDLE: // IDLE == 1 console.log('IDLE'); break; case appCache.CHECKING: // CHECKING == 2 console.log('CHECKING'); break; case appCache.DOWNLOADING: // DOWNLOADING == 3 console.log('DOWNLOADING'); break; case appCache.UPDATEREADY: // UPDATEREADY == 4 console.log('UPDATEREADY'); appCache.swapCache(); // The fetch was successful, swap in the new cache. break; case appCache.OBSOLETE: // OBSOLETE == 5 console.log('OBSOLETE'); break; default: console.log('UKNOWN CACHE STATUS'); break; };
// Check if a new cache is available on page load. window.addEventListener('load', function(e) { window.applicationCache.addEventListener('updateready', function(e) { if (window.applicationCache.status == window.applicationCache.UPDATEREADY) { // Browser downloaded a new app cache. // Swap it in and reload the page to get the new hotness. window.applicationCache.swapCache(); if (confirm('A new version of this site is available. Load it?')) { window.location.reload(); } } else { // Manifest didn't changed. Nothing new to server. } }, false); }, false);
/*缓存公用方法*/ var EventUtil = { addHandler: function(element, type, handler) { if (element.addEventListener) { element.addEventListener(type, handler, false); } else if (element.attachEvent) { element.attachEvent("on" + type, handler); } else { element["on" + type] = handler; } } }; EventUtil.addHandler(applicationCache, "updateready", function() { //缓存更新并已下载,要在下次进入页面生效 applicationCache.update(); //检查缓存manifest文件是否更新,ps:页面加载默认检查一次。 applicationCache.swapCache(); //交换到新的缓存项中,交换了要下次进入页面才生效 location.reload(); //从新载入页面 });