html5本地缓存
HTML5-本地存储浅谈
HTML5-本地存储浅谈Web Storage是HTML5⾥⾯引⼊的⼀个类似于cookie的本地存储功能,可以⽤于客户端的本地存储sessionStorage && localStoragesessionStorage - ⽤于临时保存同⼀窗⼝(或标签页)的数据,在关闭窗⼝或标签页之后将会删除这些数据,会话级别的存储。
localStorage - ⽤于持久化的本地存储,除⾮主动删除数据,否则数据会⼀直存在不同于cookie的4kb数据存储量localStorage和sessionStorage均可以保存5MB的信息localStorage和sessionStorage:仅在客户端(即浏览器)中保存,不参与和服务器的通信localStorage和sessionStorage:原⽣接⼝可以使⽤localStorage和sessionStorage:在前端页⾯即可查看,安全性能较差sessionStorage && localStoragesetItem - 存储数据getItem - 获取指定键名数据removeItem - 删除指定键名数据clear - 删除全部数据valueOf - 获取全部数据判断是否⽀持if (window.localStorage or window.sessionStorage) {// 浏览器⽀持localStorage or sessionStorage }else{// 不⽀持}应⽤场景localStorage可以⽤来夸页⾯传递参数sessionStorage⽤来保存⼀些临时的数据,防⽌⽤户刷新页⾯之后丢失了⼀些参数作⽤域localStorage: 在同⼀个浏览器内,可以进⾏数据操作sessionStorage: 在同⼀浏览器、同⼀窗⼝的同源⽂档才能共享数据,进⾏数据操作兼容性IndexedDBIndexedDB - 是⼀种低级API,⽤于客户端存储⼤量结构化数据(包括, ⽂件/ blobs)。
html5本地存储的概念
html5本地存储的概念
HTML5本地存储指的是一组用于在客户端浏览器中存储数据
的技术。
它提供了一种在浏览器中存储数据的方法,使得网页可以在离线状态下继续运行,并且可以在不需要与服务器进行频繁通信的情况下提供更好的用户体验。
HTML5本地存储包括以下几种技术:
1. Web存储:Web存储API使用键值对的方式来存储数据。
它提供了两个对象,分别是localStorage和sessionStorage。
localStorage用于持久化地存储数据,而sessionStorage只在会
话期间(即在浏览器标签页关闭之前)有效。
2. IndexedDB:IndexedDB是一种高级的客户端存储技术,提
供了一个用于存储和检索结构化数据的数据库。
它支持大规模存储和高性能查询,适用于离线应用程序。
3. Web SQL数据库:Web SQL数据库是一种关系型数据库,
允许开发者使用SQL语句来访问和操作数据。
它提供了一个
基于SQL的数据库引擎,可以在浏览器中进行数据存储。
4. File API:File API允许网页直接访问用户计算机上的文件。
通过File API,网页可以读取、写入和操作本地文件,使得浏
览器变得更加像一个本地操作系统。
HTML5本地存储提供了对于网页内容和用户数据的更好控制,
使得网页可以更灵活地处理数据,并且可以在离线状态下提供更好的用户体验。
前端开发中的本地存储和缓存优化方法
前端开发中的本地存储和缓存优化方法前端开发中,本地存储和缓存优化是非常重要的一部分。
通过合理地利用本地存储和缓存机制,可以提升网页性能,减少网络请求,提高用户体验。
在本文中,我将详细介绍前端开发中的本地存储和缓存优化方法。
一、本地存储本地存储是指将数据保存在用户的浏览器中,而不是在服务器上。
在前端开发中,常用的本地存储方式有Cookie、localStorage和sessionStorage。
1. CookieCookie是最常见的本地存储方式。
它通过在浏览器和服务器之间传递小文件来存储数据。
Cookie可以设置过期时间,可以在一段时间内保留用户的登录状态等信息。
但是,Cookie的缺点是每次请求都会携带上Cookie,增加了网络请求的负担,而且Cookie的存储容量有限。
2. localStoragelocalStorage是HTML5提供的一种本地存储方式。
它可以永久保存数据,即使用户关闭浏览器,数据也会一直保存在本地。
localStorage使用起来非常方便,可以通过setItem()和getItem()方法来存取数据。
由于localStorage的优点,它在前端开发中使用非常广泛。
3. sessionStoragesessionStorage也是HTML5提供的一种本地存储方式。
它和localStorage类似,但是数据的生命周期只在当前会话中有效。
如果用户关闭了浏览器或者标签页,数据就会被清除。
sessionStorage通常用于保存临时数据。
二、缓存优化除了本地存储,缓存优化也是前端开发中重要的一部分。
通过合理地使用缓存,可以减少网络请求,提高页面加载速度。
1. 浏览器缓存浏览器缓存是指将静态资源保存在用户的浏览器中,当用户再次访问同一页面时,不再发送请求,而是直接从缓存中加载资源。
为了启用浏览器缓存,我们需要设置一些 HTTP 请求头,如Expires、Cache-Control和ETag等。
跟我学HTML5本地存储技术及应用实例
(5)独立的存储空间 每个域(包括子域)在客户端系统中有独立的存储空间, 各个存储空间是完全独立的,因此不会造成数据混乱。
5、HTML5本地存储API的主要功能说明及应用示例
(1)localStorage和sessionStorage成员属性 对localStorage和sessionStorage成员属性变量的使用完 全相同。 (2)检测浏览器是否支持本地存储的代码示例
由于在本地存储中的每个数据都必须要有一个唯一的键名 (key),不允许存在同名的键。 因此当使用setItem()函数添加相关的键值对数据时,如 果目标key值的名称已经存在,将会实现同名的键值产生出更 新的操作效果。
(2)如何读取本地存储的数据
7、实现本地数据存储的方法之二
(1)应用localStorage对象中的getItem()、setItem()和 removeItem()函数操作本地存储的数据 (2)getItem()获得指定名称的数据值 如果要取值的key不存在将返回null,如下为代码示例: var keyValue= localStorage.getItem("keyName");
(3)setItem()为指定名称的数据赋值 如果赋值的key已经存在将会覆盖该key所对应的值,如果 不存在该key,则新建一个新的项。如下为实现的代码示例: localStorage.setItem("keyName ", keyValue); 如下表为localStorage对象中的主要方法的功能和定义说明。
4、本地缓存存储 Web 页面的主要优点
(1)与传统的Cookie技术相比,HTML5中的本地存储有许多的优 点 1)首先传统的Cookie技术由于存储在本地的数据是未加密、 而且永远不会过期, 因此极易造成隐 私泄漏。 2)另外, Cookie相关的技 术也是不可或缺 的,因为Cookie 的作用是与服务 器进行交互—— 在服务器相关的 程序中可以操作 Cookie中的数据。
html5本地存储有多少种方案:
html5本地存储有多少种⽅案:
HTML5 提供了两种在客户端存储数据的新⽅法:
localStorage - 没有时间限制的数据存储
sessionStorage - 针对⼀个 session 的数据存储
之前,这些都是由 cookie 完成的。
但是 cookie 不适合⼤量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢⽽且效率也不⾼。
localStorage ⽅法
localStorage ⽅法存储的数据没有时间限制。
第⼆天、第⼆周或下⼀年之后,数据依然可⽤。
<script type="text/javascript">
stname="Smith";
document.write(stname);
</script>
sessionStorage ⽅法
sessionStorage ⽅法针对⼀个 session 进⾏数据存储。
当⽤户关闭浏览器窗⼝后,数据会被删除。
<script type="text/javascript">
stname="Smith";
document.write(stname);
</script>
sessionStorag?⽅法:
getltem setletm removeltem key(没参数) clear?
(没参数)。
HTML5本地存储Localstorage
HTML5本地存储Localstorage什么是localstorage前⼏天在⽼项⽬中发现有对cookie的操作觉得很奇怪,咨询下来是要缓存⼀些信息,以避免在URL上⾯传递参数,但没有考虑过cookie会带来什么问题:① cookie⼤⼩限制在4k左右,不适合存业务数据② cookie每次随HTTP事务⼀起发送,浪费带宽我们是做移动项⽬的,所以这⾥真实适合使⽤的技术是localstorage,localstorage可以说是对cookie的优化,使⽤它可以⽅便在客户端存储数据,并且不会随着HTTP传输,但也不是没有问题:① localstorage⼤⼩限制在500万字符左右,各个浏览器不⼀致② localstorage在隐私模式下不可读取③ localstorage本质是在读写⽂件,数据多的话会⽐较卡(firefox会⼀次性将数据导⼊内存,想想就觉得吓⼈啊)④ localstorage不能被爬⾍爬取,不要⽤它完全取代URL传参瑕不掩瑜,以上问题皆可避免,所以我们的关注点应该放在如何使⽤localstorage上,并且是如何正确使⽤。
localstorage的使⽤基础知识localstorage存储对象分为两种:① sessionStrage: session即会话的意思,在这⾥的session是指⽤户浏览某个⽹站时,从进⼊⽹站到关闭⽹站这个时间段,session对象的有效期就只有这么长。
② localStorage:将数据保存在客户端硬件设备上,不管它是什么,意思就是下次打开计算机时候数据还在。
两者区别就是⼀个作为临时保存,⼀个长期保存。
这⾥来⼀段简单的代码说明其基本使⽤:1<div id="msg" style="margin: 10px 0; border: 1px solid black; padding: 10px; width: 300px;2 height: 100px;">3</div>4<input type="text" id="text"/>5<select id="type">6<option value="session">sessionStorage</option>7<option value="local">localStorage</option>8</select>9<button onclick="save();">10保存数据</button>11<button onclick="load();">12读取数据</button>13<script type="text/javascript">14var msg = document.getElementById('msg'),15 text = document.getElementById('text'),16 type = document.getElementById('type');1718function save() {19var str = text.value;20var t = type.value;21if (t == 'session') {22 sessionStorage.setItem('msg', str);23 } else {24 localStorage.setItem('msg', str);25 }26 }2728function load() {29var t = type.value;30if (t == 'session') {31 msg.innerHTML = sessionStorage.getItem('msg');32 } else {33 msg.innerHTML = localStorage.getItem('msg');34 }35 }36</script>真实场景实际⼯作中对localstorage的使⽤⼀般有以下需求:①缓存⼀般信息,如搜索页的出发城市,达到城市,⾮实时定位信息②缓存城市列表数据,这个数据往往⽐较⼤③每条缓存信息需要可追踪,⽐如服务器通知城市数据更新,这个时候在最近⼀次访问的时候要⾃动设置过期④每条信息具有过期⽇期状态,在过期外时间需要由服务器拉取数据⑤ ......1 define([], function () {23var Storage = _.inherit({4//默认属性5 propertys: function () {67//代理对象,默认为localstorage8this.sProxy = window.localStorage;910//60 * 60 * 24 * 30 * 1000 ms ==30天11this.defaultLifeTime = 2592000000;1213//本地缓存⽤以存放所有localstorage键值与过期⽇期的映射14this.keyCache = 'SYSTEM_KEY_TIMEOUT_MAP';1516//当缓存容量已满,每次删除的缓存数17this.removeNum = 5;1819 },2021 assert: function () {22if (this.sProxy === null) {23throw 'not override sProxy property';24 }25 },2627 initialize: function (opts) {28this.propertys();29this.assert();30 },3132/*33新增localstorage34数据格式包括唯⼀键值,json字符串,过期⽇期,存⼊⽇期35 sign 为格式化后的请求参数,⽤于同⼀请求不同参数时候返回新数据,⽐如列表为北京的城市,后切换为上海,会判断tag不同⽽更新缓存数据,tag相当于签名 36每⼀键值只会缓存⼀条信息37*/38 set: function (key, value, timeout, sign) {39var _d = new Date();40//存⼊⽇期41var indate = _d.getTime();4243//最终保存的数据44var entity = null;4546if (!timeout) {47 _d.setTime(_d.getTime() + this.defaultLifeTime);48 timeout = _d.getTime();49 }5051//52this.setKeyCache(key, timeout);53 entity = this.buildStorageObj(value, indate, timeout, sign);5455try {56this.sProxy.setItem(key, JSON.stringify(entity));57return true;58 } catch (e) {59//localstorage写满时,全清掉60if ( == 'QuotaExceededError') {61// this.sProxy.clear();62//localstorage写满时,选择离过期时间最近的数据删除,这样也会有些影响,但是感觉⽐全清除好些,如果缓存过多,此过程⽐较耗时,100ms以内 63if (!this.removeLastCache()) throw '本次数据存储量过⼤';64this.set(key, value, timeout, sign);65 }66 console && console.log(e);67 }68return false;69 },7071//删除过期缓存72 removeOverdueCache: function () {73var tmpObj = null, i, len;7475var now = new Date().getTime();76//取出键值对77var cacheStr = this.sProxy.getItem(this.keyCache);78var cacheMap = [];79var newMap = [];80if (!cacheStr) {81return;82 }8384 cacheMap = JSON.parse(cacheStr);8586for (i = 0, len = cacheMap.length; i < len; i++) {87 tmpObj = cacheMap[i];88if (tmpObj.timeout < now) {89this.sProxy.removeItem(tmpObj.key);90 } else {91 newMap.push(tmpObj);92 }93 }94this.sProxy.setItem(this.keyCache, JSON.stringify(newMap));9596 },9798 removeLastCache: function () {99var i, len;100var num = this.removeNum || 5;101102//取出键值对103var cacheStr = this.sProxy.getItem(this.keyCache);104var cacheMap = [];105var delMap = [];106107//说明本次存储过⼤108if (!cacheStr) return false;109110 cacheMap.sort(function (a, b) {111return a.timeout - b.timeout;112 });113114//删除了哪些数据115 delMap = cacheMap.splice(0, num);116for (i = 0, len = delMap.length; i < len; i++) {117this.sProxy.removeItem(delMap[i].key);118 }119120this.sProxy.setItem(this.keyCache, JSON.stringify(cacheMap));121return true;122 },123124 setKeyCache: function (key, timeout) {125if (!key || !timeout || timeout < new Date().getTime()) return;126var i, len, tmpObj;127128//获取当前已经缓存的键值字符串129var oldstr = this.sProxy.getItem(this.keyCache);130var oldMap = [];131//当前key是否已经存在132var flag = false;133var obj = {};134 obj.key = key;135 obj.timeout = timeout;136137if (oldstr) {138 oldMap = JSON.parse(oldstr);139if (!_.isArray(oldMap)) oldMap = [];140 }141142for (i = 0, len = oldMap.length; i < len; i++) {143 tmpObj = oldMap[i];144if (tmpObj.key == key) {145 oldMap[i] = obj;146 flag = true;147break;148 }149 }150if (!flag) oldMap.push(obj);151//最后将新数组放到缓存中152this.sProxy.setItem(this.keyCache, JSON.stringify(oldMap)); 153154 },155156 buildStorageObj: function (value, indate, timeout, sign) { 157var obj = {158 value: value,159 timeout: timeout,160 sign: sign,161 indate: indate162 };163return obj;164 },165166 get: function (key, sign) {167var result, now = new Date().getTime();168try {169 result = this.sProxy.getItem(key);170if (!result) return null;171 result = JSON.parse(result);172173//数据过期174if (result.timeout < now) return null;175176//需要验证签名177if (sign) {178if (sign === result.sign)179return result.value;180return null;181 } else {182return result.value;183 }184185 } catch (e) {186 console && console.log(e);187 }188return null;189 },190191//获取签名192 getSign: function (key) {193var result, sign = null;194try {195 result = this.sProxy.getItem(key);196if (result) {197 result = JSON.parse(result);198 sign = result && result.sign199 }200 } catch (e) {201 console && console.log(e);202 }203return sign;204 },205206 remove: function (key) {207return this.sProxy.removeItem(key);208 },209210 clear: function () {211this.sProxy.clear();212 }213 });214215 Storage.getInstance = function () {216if (this.instance) {217return this.instance;218 } else {219return this.instance = new this();220 }221 };222223return Storage;224225 });View Code这段代码包含了localstorage的基本操作,并且对以上问题做了处理,⽽真实的使⽤还要再抽象: 1 define(['AbstractStorage'], function (AbstractStorage) {23var Store = _.inherit({4//默认属性5 propertys: function () {67//每个对象⼀定要具有存储键,并且不能重复8this.key = null;910//默认⼀条数据的⽣命周期,S为秒,M为分,D为天11this.lifeTime = '30M';1213//默认返回数据14// this.defaultData = null;1516//代理对象,localstorage对象17this.sProxy = new AbstractStorage();1819 },2021 setOption: function (options) {22 _.extend(this, options);23 },2425 assert: function () {26if (this.key === null) {27throw 'not override key property';28 }29if (this.sProxy === null) {30throw 'not override sProxy property';31 }32 },3334 initialize: function (opts) {35this.propertys();36this.setOption(opts);37this.assert();38 },3940 _getLifeTime: function () {41var timeout = 0;42var str = this.lifeTime;43var unit = str.charAt(str.length - 1);44var num = str.substring(0, str.length - 1);45var Map = {46 D: 86400,47 H: 3600,48 M: 60,49 S: 150 };51if (typeof unit == 'string') {52 unit = unit.toUpperCase();53 }54 timeout = num;55if (unit) timeout = Map[unit];5657//单位为毫秒58return num * timeout * 1000 ;59 },6061//缓存数据62 set: function (value, sign) {63//获取过期时间64var timeout = new Date();65 timeout.setTime(timeout.getTime() + this._getLifeTime());66this.sProxy.set(this.key, value, timeout.getTime(), sign);67 },6869//设置单个属性70 setAttr: function (name, value, sign) {71var key, obj;72if (_.isObject(name)) {73for (key in name) {74if (name.hasOwnProperty(key)) this.setAttr(k, name[k], value);75 }76return;77 }7879if (!sign) sign = this.getSign();8081//获取当前对象82 obj = this.get(sign) || {};83if (!obj) return;84 obj[name] = value;85this.set(obj, sign);8687 },8889 getSign: function () {90return this.sProxy.getSign(this.key);91 },9293 remove: function () {94this.sProxy.remove(this.key);95 },9697 removeAttr: function (attrName) {98var obj = this.get() || {};99if (obj[attrName]) {100delete obj[attrName];101 }102this.set(obj);103 },104105 get: function (sign) {106var result = [], isEmpty = true, a;107var obj = this.sProxy.get(this.key, sign);108var type = typeof obj;109var o = { 'string': true, 'number': true, 'boolean': true };110if (o[type]) return obj;111112if (_.isArray(obj)) {113for (var i = 0, len = obj.length; i < len; i++) {114 result[i] = obj[i];115 }116 } else if (_.isObject(obj)) {117 result = obj;118 }119120for (a in result) {121 isEmpty = false;122break;123 }124return !isEmpty ? result : null;125 },126127 getAttr: function (attrName, tag) {128var obj = this.get(tag);129var attrVal = null;130if (obj) {131 attrVal = obj[attrName];132 }133return attrVal;134 }135136 });137138 Store.getInstance = function () {139if (this.instance) {140return this.instance;141 } else {142return this.instance = new this();143 }144 };145146return Store;147 });View Code我们真实使⽤的时候是使⽤store这个类操作localstorage,代码结束简单测试:存储完成,以后都不会⾛请求,于是今天的代码基本结束。
HTML5的应用缓存
HTML5的应⽤缓存HTML5:提供⼀种应⽤缓存机制,使得基于web的应⽤程序可以离线运⾏。
开发者可以使⽤ Application Cache (AppCache) 接⼝设定浏览器缓存的数据并使得数据离线有效。
在处于离线状态时,即使⽤户点击刷新按钮,应⽤也能正常加载与⼯作。
使⽤应⽤缓存可以得到以下益处:离线浏览: ⽤户可以在离线状态下浏览⽹站内容。
更快的速度: 因为数据被存储在本地,所以速度会更快。
减轻服务器的负载: 浏览器只会下载在服务器上发⽣改变的资源。
⽤法:只需要在你的页⾯头部加上⼀个 manifest 的属性就可以了。
<!DOCTYPE HTML><html manifest = "cache.manifest">...</html>cache.manifest⽂件的书写⽅式:CACHE MANIFEST# v1 2011-08-14# 这是⼀个完整的页⾯index.htmlcache.htmlstyle.cssimage1.pngNETWORK:network.htmlFALLBACK:/ fallback.html1.CACHE:表⽰需要离线存储的资源列表,由于包含manifest⽂件的页⾯将被⾃动离线存储,所以不需要把页⾯⾃⾝也列出来。
WORK:表⽰在它下⾯列出来的资源只有在在线的情况下才能访问,他们不会被离线存储,所以在离线情况下⽆法使⽤这些资源。
不过,如果在CACHE和NETWORK中有⼀个相同的资源,那么这个资源还是会被离线存储,也就是说CACHE的优先级更⾼。
3.FALLBACK:表⽰如果访问第⼀个资源失败,那么就使⽤第⼆个资源来替换他,⽐如上⾯这个⽂件表⽰的就是如果访问根⽬录下任何⼀个资源失败了,那么就去访问fallback.html。
HTML5中离线储存对象 window.applicationCache 常⽤的事件:1.oncached:当离线资源存储完成之后触发这个事件,这个是⽂档的说法,我在Chrome上⾯测试的时候并没有触发这个事件。
HTML5实现应用程序缓存(ApplicationCache)
HTML5实现应⽤程序缓存(ApplicationCache)为什么要使⽤Application Cache技术?在HTML5之前,我们需要接⼊⽹络才能访问,这毫⽆疑问是⽹站多次请求服务器,造成速度变慢,对于PC⽤户,⽹络相对⽐较稳定,载⼊速度也不会差太多。
但是移动端呢?移动端依赖⽆线信号、依赖信号塔、位置不固定、受附近建筑影响等。
⼀系列导致⽹络的不稳定,我们不能改变⽤户,也不能放弃⽹络较慢的⽤户。
还有,在混合app领域,经常使⽤内置webview加载html页⾯,如果⽹速太慢,依然会造成上述问题。
离线存储技术实际开发中,主要是使⽤Application Cache和LocalStorage技术,它们来⾃HTML5技术。
(1)Application Cache:通常⽤于静态资源(静态页⾯)的缓存。
(2)LocalStorage:通常⽤于AJAX请求缓存,存储⾮关键性AJAX数据。
我⽤⼀段话来赘述下为什么要使⽤Application Cache技术:当页⾯有些元素它们是不变的,你可以使⽤Application Cache技术离线缓存掉,每次访问这些缓存掉的元素就不需要再请求服务器了,当有些东西经常变,那就让它们每次请求服务器吧!HTML5 Application Cache特性HTML5 引⼊了应⽤程序缓存,这意味着 web 应⽤可进⾏缓存,并可在没有因特⽹连接时进⾏访问。
应⽤程序缓存为应⽤带来三个优势:(1)离线浏览:⽤户可在不介⼊⽹络时访问使⽤(2)速度提升:已缓存资源加载得更快(3)减少对服务器的请求:浏览器将只从服务器下载更新过或更改过的资源⽀持情况:除了IE浏览器,都⽀持Application Cache开始使⽤Application Cache涉及⾓⾊:服务器和html⽂件服务器端需要做的事情管理维护manifest.appcache⽂件,检查manifest清单中是否有⽆法访问的⽂件,并及时更新,以免造成损失。
HTML5本地存储localStorage与sessionStorage详解
HTML5本地存储localStorage与sessionStorage详解前⾔在最近的项⽬中⽤到了html5的本地存储,下⾯总结⼀下。
1、html5⼏种存储形式本地存储(localStorage && sessionStorage)离线缓存(application cache)indexedDB 和 webSQL2、localStorage && sessionStorage过期时间:localStorage 永久存储,永不失效除⾮⼿动删除。
sessionStorage 浏览器重新打开后就消失了⼤⼩:每个域名是5M。
注:cookie⼀是⼤⼩限制,貌似4K左右,⼆是IE6浏览器下每个域名下好像还有个数限制。
对于HTML5的本地存储IE浏览器从IE8开始就已经⽀持了。
IE6~7浏览器尚不⽀持,所以采⽤传统的cookie保持信息,⽽其他浏览器就使⽤HTML5的本地存储功能。
写⼊:var arrDisplay = [0, 1, 1, 1];//存储,IE6~7 cookie 其他浏览器HTML5本地存储if (window.localStorage) {localStorage.setItem("menuTitle", arrDisplay);} else {Cookie.write("menuTitle", arrDisplay);}读取:var strStoreDate = window.localStorage? localStorage.getItem("menuTitle"): Cookie.read("menuTitle");HT ML A PIlocalstorage在浏览器的API有两个:localStorage和sessionStorage,存在于window对象中:localStorage对应window.localStorage,sessionStorage对应window.sessionStorage。
HTML5本地存储和离线缓存应用研究
HTML5本地存储和离线缓存应用研究HTML5是一代具有创新性、革命性的新型互联网编程语言,是当前网络上应用最为广泛的语言形式,同时也是形成网页文档的主要语言之一。
近几年来,在互联网行业与领域得到了广泛的普及与发展。
HTML的传统旧版本已经在十余年前形成并使用,然而面对现代Web的应用需求却存在不足。
在基于现代Web 现代需求的基础上,HTML5应运而生。
文章主要针对HTML5本地存储与离线缓存应用进行探析。
标签:HTML5;本地存储;离线缓存伴随着互联网技术的发展与进步,多元化的Web应用以及javascript编码已经成为了主流应用趋势。
当前在电脑客户端上各类主流浏览器都不同程度上支持HTML5。
在移动平台上苹果、谷歌以及Zetakey也支持HTML5的众多功能。
在网页应用上YouTube、优酷等主流视频网站也已经开始支持HTML5形式的音频媒体。
因此,HTML5的本地存储与离线缓存应用机制的研究显得十分迫切。
1 HTML5特性HTML5是互联网的新一代标准,同时也是构建与表现互联网内容的一种语言方式,其被认为是互联网的重要核心技术之一[1]。
HTML自从1990年开始已经经过了二十余年的发展。
1997年HTML4已成为了互联网的标准,并且普及应用到互联网的开发过程中,而HTML5是HTML的第五个版本,同时也是最新的版本。
HTML5的广义概念为包括HTML、CSS以及JavaScript 的技术结合,其作用在于减少浏览器对于需要插件的丰富性网络应用服务,比如Adobe Flash、Microsoft Silverlight 与Oracle JavaFX的需求,同时还可以给予更多的能够强化网络应用的标准集[2]。
总体来说,HTML5增加了多样的语法特征,其中包括、和等,同时还将SVG的内容整合在一起,这些元素的存在让网页开展多媒体与图像处理更加容易。
同时,还有一些元素被取消,比如、、。
另外,还有一些元素被调整与修改,例如、和等。
html5的页面缓存和本地数据存储支持
html5的页面缓存和本地数据存储支持1. html5的页面缓存有一个web应用有三个文件index.html,a.js,b.css,现在需要把js和css文件缓存起来1.在index.html里加上2.manifest清单格式如下CACHE MANIFEST#上面一句必须#v1.0.0#需要缓存的文件CACHE:a.jsb.css#不需要缓存的文件NETWORK:*#无法访问页面FALLBACK:404.html3.manifest文件的mime-type必须是text/cache-manifest类型注意点:1.对于每个index.html?id=1或index.html?id=2都会分别缓存index.html页面,可以通过chrome浏览器Resources/Application Cache观察2.如果想更新缓存内容,只要修改下manifest文件即可,如改版本号v1.0.14.离线存储如果资源有更新,可以通过如下代码来监听,但第一次加载还会是原来的版本window.applicationCache.addEventListener('updateready',function(e){if(window.applicationCache.status == window.applicationCache.UPDATEREADY){window.applicationCache.swapCache();if(confirm("loding new?")){window.location.reload()}}},false)2.html5的本地数据存储支持一个网站如何能在客户的浏览器存储更多的数据呢?在Html4的时代在浏览器端存储点网站个性化的数据,尤其是用户浏览器的痕迹,用户的相关数据等一般只能存储在Cookie中,但是大多是浏览器对于Cookie的限制也就逼迫网站存储数据尽量精简,想存储复杂的、关系型的用户数据就根本不可能了。
h5缓存机制
h5缓存机制HTML5缓存机制是一种用于将网页资源缓存到用户设备上的技术,以提高网页加载速度和离线访问能力。
它利用浏览器的缓存来存储网页资源,从而减少对服务器的请求次数,同时可以让用户在没有网络连接的情况下访问已缓存的网页。
HTML5缓存机制通过使用两个主要的API来实现:Application Cache API 和 IndexedDB API。
Application Cache API 允许开发者将网页资源列入缓存清单,而 IndexedDB API 则提供了一种将网页资源存储在本地数据库中的方式。
使用 Application Cache API 必须在 HTML 文档的头部添加一个manifest 文件的链接。
这个 manifest 文件里列出了需要缓存的资源,包括 HTML、CSS、JavaScript 和图片等静态文件。
一旦浏览器下载了这个 manifest 文件,它会根据其中的路径和文件信息自动下载并缓存相应的资源。
同时,我们还可以使用一些特殊的注释来控制缓存的行为。
比如,我们可以通过在 HTML 头部的注释中添加 "CACHE MANIFEST" 来指定一个缓存清单的文件,或者使用 "FALLBACK" 来指定在无网络连接时的替代资源。
此外,我们还可以使用 "NETWORK" 注释来指定不需要缓存的资源。
除了使用 Application Cache API,我们还可以使用 IndexedDB API 来实现更加灵活的缓存控制。
IndexedDB 是一种在浏览器中存储结构化数据的方式,它允许我们将网页资源存储在本地数据库中。
通过使用 IndexedDB,我们可以更加精细地控制缓存的更新和存储策略。
在使用 IndexedDB 时,我们首先需要创建一个数据库,并定义对象存储空间。
然后,我们可以将网页资源以键值对的形式存储在数据库中。
Html5应用程序缓存(Cachemanifest)
Html5应⽤程序缓存(Cachemanifest)⼀、作⽤离线浏览 - 根据⽂件规则把资源缓存在本地,脱机依然能够访问资源,联⽹会直接使⽤缓存在本地的⽂件。
优化加载速度,节约服务器资源。
⼆、适⽤场景正如 manifest 英译的名字:离线应⽤程序缓存,这项功能是设计给会有离线场景的应⽤来使⽤,例如:需要离线使⽤的⼿机APP/H5,亦或是PC端的纯静态页⾯。
三、问题1.服务器资源更新后显⽰滞后需要多刷新⼀次页⾯1. ⾸次在载⼊页⾯时,浏览器会判断是否引⼊了 manifest,若检测到引⼊,则下载并按⽂件规则缓存资源。
2. 再次载⼊页⾯时,便会根据 manifest 中规定的缓存⽂件使⽤本地缓存⽽不是请求服务器资源。
3. 当 manifest ⽂件更新时,页⾯加载已经进⾏,但是缓存更新尚未完成,便会先使⽤旧 manifest 所缓存的⽂件,同时浏览器会将新的 manifest ⽂件⾥的缓存⽂件下载下来,若想看到最新的静态资源需要刷新下页⾯重新加载⼀次。
2.全量加载当 manifest ⽂件更新时,所有的资源都要全部被下载⼀次,并且其中⼀个出现异常会导致整个 manifest 运⾏异常。
3.W3C标准及浏览器⽀持作为 H5 的新属性,初衷是⽤来构造离线应⽤的,缓存⽹站资源的话原本浏览器的缓存机制(304)已经很好了,没必要再使⽤ manifest 做缓存;实际上因为使⽤反响并不好,W3C正在废弃 manifest。
四、使⽤⽅法⾸先在标签 <html> 中指定 manifest 配置⽂件。
<html manifest="manifest.appcache">配置⽂件 manifest.appcache。
CACHE MANIFEST# 井号备注,这边可以放版本更新时间,修改备注算更新 manifest ⽂件CACHE:# ⾸次下载 CACHE 后列出来的⽂件后缓存到本地。
【每日一步】HTML5本地存储
在HTML5本地存储之前,如果我们想在客户端保存持久化数据,有这么几个选择:1HTTP cookie。
HTTP cookie的缺点很明显,最多只能存储4KB的数据,每个HTTP 请求都会被传送回服务器,明文传输(除非你使用SSL)。
2IE userData。
userData是微软在上世纪90年代的浏览器大战时推出的本地存储方案,借助DHTML的behaviour属性来存储本地数据,允许每个页面最多存储64K数据,每个站点最多640K数据,userData的缺点显而易见,它不是Web标准的一部分,除非你的程序只需要支持IE,否则它基本没什么用处。
3Flash cookie。
Flash cookie的名字有些误导,它实际上和HTTP cookie并不是一回事,或许它的名字应该叫做"Flash本地存储”,Flash cookie默认允许每个站点存储不超过100K的数据,如果超出了,Flash会自动向用户请求更大的存储空间,借助Flash的ExternalInterface接口,你可以很轻松地通过Javascript操作Flash的本地存储。
Flash 的问题很简单,就是因为它是Flash。
4Google Gears。
Gears是Google在07年发布的一个开源浏览器插件,旨在改进各大浏览器的兼容性,Gears内置了一个基于SQLite的嵌入式SQL数据库,并提供了统一API对数据库进行访问,在取得用户授权之后,每个站点可以在SQL数据库中存储不限大小的数据,Gears的问题就是Google自己都已经不用它了。
现状我们现在通常所说的HTML5本地存储,一般指的是Web Storage规范,这个标准曾经是HTML5规范的一部分,但后来因为种种原因从HTML5规范中分离了出来。
Web StorageWeb Storage是目前得到支持最广泛的HTML5本地存储规范:IE 8+、FF 3.5+、Safari 4+、Chrome 4+、Opera 10.5+,以及iPhone 2+和Android 2+都已经支持Web Storage,要判断你的浏览器是否支持Web Storage,可以使用下面这个函数:HTML5 Storage的使用非常简单:也可以写成下面这样你也可以像遍历数组那样遍历存储的所有键值对象:如果你的程序需要在不同页面访问同一个值,你可能需要了解这个值是否已经被其他页面改变了,这可以通过向浏览器注册storage事件来实现这时你应该会在A页面的Console中看到:foo‟s value is changed from …bar‟ to …newbar‟ by http://localhost/test.html要注意的是,storage事件仅仅只是通知你某个键对应的值已经发生了改变,你没有办法在回调中阻止这个改变发生。
HTML5基础扩展——地理位置、本地存储、缓存
HTML5基础扩展——地理位置、本地存储、缓存HTML5扩展,继上两篇博客,我们来看一下HTML5的一些扩展的功能,由于HTML5更多是为了兼容电脑浏览器,安卓浏览器,苹果浏览器更多浏览器,或者说为这些浏览器提供一个统一的标准.因此目前在手机上的web开发,HTML5是比较火的。
因此这几款扩展功能,感觉更多是从手机,平板等角度出发的。
一,地理定位:首先看一下地理位置的定位的几种形式:IP地址,GPS(Global Positioning System ),Wifi,GSM(Global System for Mobile Communication )/CDMA(Code Division Multiple Access)。
一般手机都是通过GPS进行定位的,相对准确。
好看一下HTML5如何实现地理位置:1. 实现基于浏览器(无需后端支持)获取用户的地理位置技术2. 精确定位用户的地理位置( 精度最高达10m之内,依赖设备)3. 持续追踪用户的地理位置(实时位置)4. 与Google Map、或者Baidu Map 交互呈现位置信息。
HTML5提供Geolocation API,用于将用户当前地理位置信息共享给信任的站点,这涉及用户的隐私安全问题,所以当一个站点需要获取用户的当前地理位置,浏览器会提示用户是“允许”or “拒绝”。
它提供的方法:1、getCurrentPosition //当前位置2、watchPosition //监视位置3、clearWatch //清除监视看一下参数:getCurrentPosition(success,error,option)方法最多可以有三个参数:第一个参数是成功获取位置信息的回调函数,它是方法唯一必须的参数;第二个参数用于捕获获取位置信息出错的情况,第三个参数是配置项。
看一个例子吧:综上为简单的地理定位了解,由于只是学习,了解的比较浅显。
更多资料可以网络搜索,非常多的,很容易的帮助我们实现了手机定位的功能开发。
前端开发技术中常见的数据存储和本地缓存方法
前端开发技术中常见的数据存储和本地缓存方法在前端开发中,数据存储和本地缓存是非常重要的部分。
通过合理地选择合适的数据存储和本地缓存方法,我们可以提高网页或应用程序的性能、用户体验和数据管理能力。
本文将介绍一些前端开发中常见的数据存储和本地缓存方法。
一、CookieCookie 是前端开发中最常见的数据存储方式之一。
它是存储在浏览器中的小型文本文件,用于存储网站或应用程序相关的信息。
Cookie 可以保存用户的登录状态、用户喜好设置等数据。
通过在服务器端设置 Cookie,并在客户端读取和写入Cookie,我们可以实现一些简单的数据存储和跨页面的数据传递。
然而,Cookie 也有一些限制。
首先,每个 Cookie 的大小通常有限制,一般为几 KB。
其次,Cookie 存储在客户端,容易被篡改,因此不适合存储敏感信息。
另外,每次向服务器发送请求时,所有 Cookie 都会被发送,这可能影响性能。
二、Web StorageWeb Storage 是 HTML5 引入的一种数据存储方式,包括 localStorage 和sessionStorage 两种类型。
localStorage 和 sessionStorage 可以存储大量的数据,并且存储在浏览器端,不会随着请求发送到服务器。
localStorage 存储的数据会一直保留,直到用户手动删除。
它适合用于长期存储的数据,例如用户的个人配置信息。
sessionStorage 存储的数据仅在当前会话(当前浏览器窗口或标签页)中有效,关闭窗口或标签页后数据会被清空。
sessionStorage 适合用于临时存储会话期间需要的数据。
Web Storage API 简单易用,只需要通过 JavaScript 的 localStorage 和sessionStorage 对象的方法进行读写操作。
它们支持键值对的形式存储。
三、IndexedDBIndexedDB 是一种比 Web Storage 更强大的客户端数据库。
Html5的缓存数据库容量大小
Html5的缓存数据库容量大小
现在越来越多的网站都使用html5,为了更好的浏览和更好的体验,就会使用本地缓存数据库,可是缓存数据库也有限制的,这个是否确认吗?
本地缓存数据库支持多大的缓存,这些可能都需要了解了,才能更好的写好程序,知己知彼,才能更清楚了解浏览器的缓存使用和容量。
如果你想学习java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料可以下载。
先看一下Mobile手机端浏览器的缓存的支持:
PC端对浏览器缓存的支持:
从缓存数据库容量大小来看,程序所要应对的数据就要相应的调整,刷新和数据的调用也要适用当前数据库。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HTML5 本地存储 LocalStorage
(2010-10-31 20:39:59)
转载▼
标签:
html5
本地存储
分类:前端技术
localstorage
sessionstorage
storage
(转载请注明出处:/s/blog_4515673f0100mm6m.html)
说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示:
最早的Cookies自然是大家都知道,问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个cookies,太少了。
优势就是大家都支持,而且支持得还蛮好。
很早以前那些禁用cookies的用户也都慢慢的不存在了,就好像以前禁用javascript的用户不存在了一样。
userData是IE的东西,垃圾。
现在用的最多的是Flash吧,空间是Cookie的25倍,基本够用。
再之后Google推出了Gears,虽然没有限制,但不爽的地方就是要装额外的插件(没具体研究过)。
到了HTML5把这些都统一了,官方建议是每个网站5MB,非常大了,就存些字符串,足够了。
比较诡异的是居然所有支持的浏览器目前都采用的5MB,尽管有一些浏览器可以让用户设置,但对于网页制作者来说,目前的形势就5MB来考虑是比较妥当的。
支持的情况如上图,IE在8.0的时候就支持了,非常出人意料。
不过需要注意的是,IE、Firefox测试的时候需要把文件上传到服务器上(或者localhost),直接点开本地的HTML文件,是不行的。
首先自然是检测浏览器是否支持本地存储。
在HTML5中,本地存储是一个window的属性,包括localStorage和sessionStorage,从名字应该可以很清楚的辨认二者的区别,前者是一直存在本地的,后者只是伴随着session,窗口一旦关闭就没了。
二者用法完全相同,这里以localStorage为例。
if(window.localStorage){
alert('This browser supports localStorage');
}else{
alert('This browser does NOT support localStorage');
}
存储数据的方法就是直接给window.localStorage添加一个属性,例如:window.localStorage.a 或者window.localStorage["a"]。
它的读取、写、删除操作方法很简单,是以键值对的方式存在的,如下:
localStorage.a = 3;//设置a为"3"
localStorage["a"] = "sfsf";//设置a为"sfsf",覆盖上面的值
localStorage.setItem("b","isaac");//设置b为"isaac"
var a1 = localStorage["a"];//获取a的值
var a2 = localStorage.a;//获取a的值
var b = localStorage.getItem("b");//获取b的值
localStorage.removeItem("c");//清除c的值
这里最推荐使用的自然是getItem()和setItem(),清除键值对使用removeItem()。
如果希望一次性清除所有的键值对,可以使用clear()。
另外,HTML5还提供了一个key()方法,可以在不知道有哪些键值的时候使用,如下:
var storage = window.localStorage;
function showStorage(){
for(var i=0,l=storage.length;i
//key(i)获得相应的键,再用getItem()方法获得对应的值
document.write(storage.key(i)+ " : " + storage.getItem(storage.key(i)) + "
");
}
}
写一个最简单的,利用本地存储的计数器:
var storage = window.localStorage;
if (!storage.getItem("pageLoadCount")) storage.setItem("pageLoadCount",0);
storage.pageLoadCount = parseInt(storage.getItem("pageLoadCount")) + 1;//必须格式转换
document.getElementByIdx_x_x_x_x_x("count").innerHTML = storage.pageLoadCount;
showStorage();
不断刷新就能看到数字在一点点上涨,如下图所示:
需要注意的是,HTML5本地存储只能存字符串,任何格式存储的时候都会被自动转为字符串,所以读取的时候,需要自己进行类型的转换。
这也就是上一段代码中parseInt必须要使用的原因。
另外,在iPhone/iPad上有时设置setItem()时会出现诡异的
QUOTA_EXCEEDED_ERR错误,这时一般在setItem之前,先removeItem()就ok了。
HTML5的本地存储,还提供了一个storage事件,可以对键值对的改变进行监听,使用方法如下:
if(window.addEventListener){
window.addEventListener("storage",handle_storage,false);
}else if(window.attachEvent){
window.attachEvent("onstorage",handle_storage);
}
function handle_storage(e){
if(!e){e=window.event;}
//showStorage();
}
对于事件变量e,是一个StorageEvent对象,提供了一些实用的属性,可以很好的观察键值对的变化,如下表:
Property Type Description
key String The named key that was added, removed, or moddified
The previous value(now overwritten), or null if a new item was
oldValue Any
added
newValue Any The new value, or null if an item was added
url/uri String The page that called the method that triggered this change
这里添加两个键值对a和b,并增加一个按钮。
给a设置固定的值,当点击按钮时,修改b的值:
测试发现,目前浏览器对这个支持不太好,仅iPad和Firefox支持,而且Firefox 支持得乱糟糟,e对象根本没有那些属性。
iPad支持非常好,用的是e.uri(不是e.url),台式机上的Safari不行,诡异。
目前浏览器都带有很好的开发者调试功能,下面分别是Chrome和Firefox的调试工具查看LocalStorage:
另外,目前javascript使用非常多的json格式,如果希望存储在本地,可以直接调用JSON.stringify()将其转为字符串。
读取出来后调用JSON.parse()将字符串转为json格式,如下所示:
var details = {author:"isaac","description":"FE","rating":100};
storage.setItem("details",JSON.stringify(details));
details = JSON.parse(storage.getItem("details"));
JSON对象在支持localStorage的浏览器上基本都支持,需要注意的是IE8,它支持JSON,但如果添加了如下的兼容模式代码,切到IE7模式就不行了(此时依
然支持localStorage,虽然显示window.localStorage是[object],而不是之前的[object Storage],但测试发现getItem()、setItem()等均能使用)。