分享

从javascript读取cookies说开去:谈谈网页的本地化存储

 昵称10504424 2013-12-24

学习要点:
1.cookies

2.cookies 局限性

3.其他存储

随着 Web 越来越复杂,开发者急切的需要能够本地化存储的脚本功能。这个时候,第一个出现的方案:cookie 诞生了。cookie 的意图是:在本地的客户端的磁盘上以很小的文件形式保存数据。
一.Cookies
cookies 也叫 HTTP Cookies, 最初是客户端与服务器端进行会话使用的。 比如, 会员登录,下次回访网站时无须登录了; 或者是购物车, 购买的商品没有及时付款, 过两天发现购物车
里还有之前的商品列表。
HTTP Cookies 要求服务器对任意 HTTP 请求发送 Set-Cookie,因此,Cookie 的处理原则上需要在服务器环境下进行。当然,现在大部分浏览器在客户端也能实现 Cookie 的生成和获取。(目前 Chrome 不可以在客户端操作,其他浏览器均可)
cookies 的组成
cookies 由名/值对形式的文本组成:name=value。完整格式为:

name=value; [expires=date]; [path=path]; [domain=somewhere.com]; [secure]  

中括号是可选,name=value 是必选。

document.cookie = 'user=' + encodeURIComponent('ranzige'); //编码写入   
alert(decodeURIComponent(document.cookie)); //解码读取  

expires=date 失效时间,如果没有声明,则为浏览器关闭后即失效。声明了失效时间,那么时间到期后方能失效。

var date = new Date(); //创建一个   
date.setDate(date.getDate() + 7);
document.cookie = "user= " + encodeURIComponent('ranzige') +";expires=" + date;  

PS: 可以通过 Firefox 浏览器查看和验证失效时间。 如果要提前删除 cookie 也非常简单,只要重新创建 cookie
把时间设置当前时间之前即可:date.getDate() - 1 或 new Date(0)。
path=path 访问路径, 当设置了路径,
那么只有设置的那个路径文件才可以访问 cookie。

var path = '/E:/%E5%A4%87%E8%AF%BE%E7%AC%94%E8%AE%B0/JS1/29/demo';
document.cookie = "user= " + encodeURIComponent('ranzige') + ";path=" + path;  

PS:为了操作方便,我直接把路径复制下来,并且增加了一个目录以强调效果。
domain=domain
访问域名,用于限制只有设置的域名才可以访问,那么没有设置,会默认限制为创建 cookie 的域名。

var domain = 'cnblogs.com';
document.cookie = "user= " + encodeURIComponent('ranzige') + ";domain=" + domain;  

PS:如果定义了 cnblogs.com,那么在这个域名下的任何网页都可访问,如果定义了dotnet.cnblogs.com,那么只能在这个二级域名访问该
cookie,而主域名和其他子域名则不能访问。
PS:设置域名,必须在当前域名绑定的服务器上设置,如果在 cnblogs.com
服务器上随意设置其他域名,则会无法创建 cookie。
secure 安全设置,指明必须通过安全的通信通道来传输(HTTPS)才能获取 cookie。

document.cookie = "user= " + encodeURIComponent('ranzige') + ";secure";  

PS:https 安全通信链接需要单独配置。
JavaScript 设置、 读取和删除并不是特别的直观方便,
我们可以封装成函数来方便调用。
//创建 cookie

复制代码
function setCookie(name, value, expires, path, domain, secure) {
var cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value);
if (expires instanceof Date) {
cookieText += '; expires=' + expires;
}
if (path) {
cookieText += '; expires=' + expires;
}
if (domain) {
cookieText += '; domain=' + domain;
}
if (secure) {
cookieText += '; secure';
}
document.cookie = cookieText;
}  
复制代码

//获取 cookie

复制代码
function getCookie(name) {
var cookieName = encodeURIComponent(name) + '=';
var cookieStart = document.cookie.indexOf(cookieName);
var cookieValue = null;
if (cookieStart > -1) {
var cookieEnd = document.cookie.indexOf(';', cookieStart);
if (cookieEnd == -1) {
cookieEnd = document.cookie.length;
}
cookieValue = decodeURIComponent(
document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
}
return cookieValue;
}  
复制代码

//删除 cookie

function unsetCookie(name) {
document.cookie = name + "= ; expires=" + new Date(0);
}  

//失效天数,直接传一个天数即可

复制代码
function setCookieDate(day) {
if (typeof day == 'number' && day > 0) {
var date = new Date();
date.setDate(date.getDate() + day);
} else {
throw new Error('传递的 day 必须是一个天数,必须比 0 大');
}
return date;
}  
复制代码

二.cookie 局限性
cookie 虽然在持久保存客户端用户数据提供了方便, 分担了服务器存储的负担。
但是还有很多局限性的。
第一:每个特定的域名下最多生成 20 个 cookie(根据不同的浏览器有所区别) 。
1.IE6 或更低版本最多 20 个
cookie
2.IE7 和之后的版本最多可以 50 个 cookie。 IE7 最初也只能 20 个,
之后因被升级不定后增加了。
3.Firefox 最多 50 个 cookie
4.Opera 最多 30 个 cookie
5.Safari
和 Chrome 没有做硬性限制。
PS:为了更好的兼容性,所以按照最低的要求来,也就是最多不得超过 20 个 cookie。
当超过指定的
cookie 时,浏览器会清理掉早期的 cookie。IE 和 Opera 会清理近期最少使用的 cookie,Firefox 会随机清理
cookie。
第二:cookie 的最大大约为 4096 字节(4k),为了更好的兼容性,一般不能超过 4095 字节即可。
第三:cookie
存储在客户端的文本文件,所以特别重要和敏感的数据是不建议保存在cookie
的。比如银行卡号,用户密码等。
三.其他存储
IE 提供了一种存储可以持久化用户数据,叫做 userData,从
IE5.0 就开始支持。每个数据最多 128K,每个域名下最多 1M。这个持久化数据存放在缓存中,如果缓存没有清理,那么会一直存在。

复制代码
<div style="behavior:url(#default#userData)" id="box"></div>
addEvent(window, 'load', function () {
var box = document.getElementById('box');
box.setAttribute('name', encodeURIComponent('chaoyi'));
box.expires = setCookieDate(7);
box.save('bookinfo');
//box.removeAttribute('name'); //删除 userDate   
//box.save('bookinfo');   
box.load('bookinfo');
alert(decodeURIComponent(box.getAttribute('name')));
});  
复制代码

PS:这个数据文件也是保存在 cookie 目录中,只要清除 cookie 即可。如果指定过期日期,则到期后自动删除,如果没有指定就是永久保存。
Web
存储
在比较高版本的浏览器,JavaScript 提供了 sessionStorage 和 globalStorage。在 HTML5中提供了
localStorage 来取代 globalStorage。 而浏览器最低版本为: IE8+、 Firefox3.5+、 Chrome4+和
Opera10.5+。
PS:由于这三个对浏览器版本要求较高,我们就只简单的在 Firefox
了解一下,有兴趣的可以通过关键字搜索查询。
//通过方法存储和获取

sessionStorage.setItem('name', 'ranzge');
alert(sessionStorage.getItem('name'));  

//通过属性存储和获取

sessionStorage.book = 'ranzige';
alert(sessionStorage.book);  

//删除存储

sessionStorage.removeItem('name');  

PS: 由于 localStorage 代替了 globalStorage, 所以在 Firefox、 Opera 和 Chrome
目前的最新版本已不支持。
//通过方法存储和获取

localStorage.setItem('name', 'ranzige');
alert(localStorage.getItem('name'));  

//通过属性存储和获取

localStorage.book = 'ranzige';
alert(localStorage.book);  

//删除存储

localStorage.removeItem('name');  

PS:这三个对象都是永久保存的,保存在缓存里,只有手工删除或者清理浏览器缓存方可失效。 在容量上也有一些限制, 主要看浏览器的差异, Firefox3+、
IE8+、 Opera 为 5M,Chrome 和 Safari 为 2.5M。

昵称:技术狂
园龄:2年
粉丝:12
关注:0
+加关注

搜索

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签

我的标签

  • cnblogs(18)
  • cnblogs.com(18)
  • 博客园(18)
  • jquery(11)
  • ajax(4)
  • css(4)
  • google日历(2)
  • HTML(2)
  • iframe(2)
  • 提高(2)
  • 更多

随笔档案

  • 2013年12月 (28)
  • 2013年11月 (22)
  • 2011年12月 (2)

最新评论

  • 1. Re:两段超简单jquery代码解决iframe自适应高度问题(不用判断浏览器高度)
  • 为什么加30就可以自适应了
  • --代码三郎
  • 2. Re:Jquery插件开发学习笔记:简单地入门方法
  • 请教一下楼主:什么叫"支持jQuery选择器.".500) this.width=500;"/>还好这个评论可以自己删除和修改,妈的上传图片时,不小心把工资单给传上去了,好险.
  • --思思博士
  • 3. Re:【Multiple backgrounds】用CSS3实现网页多重背景
  • 多多分享……
  • --淡淡明月
  • 4. Re:耳目一新!令人膜拜的牛人简历!厉害的攻城师啊
  • 就想知道余博雅的那个简历上的气泡效果,用css怎么做
  • --v流年v
  • 5. Re:jquery选择器的实现流程简析及提高性能建议!
  • 不错
  • --月雪维杰
  • 6. Re:在asp.net中使用jQuery实现类似QQ网站的图片切割效果
  • demo无法下载
  • --ccmyfriend
  • 7. Re:8个应该去逛逛JQuery的学习网站
  • 木有中文的,郁闷了
  • --shootingstar
  • 8. Re:[好文翻译]WEB前端性能优化的14条规则
  • 现在好像移动网站不多了,都是APP或者混合模式的APP,不过讲的都是可用的方法
  • --zmcnxd
  • 9. Re:分享七个绚丽夺目的JQuery导航(还有苹果、猪八戒等),有图有真相
  • 都是三四年前的东东,没新意
  • --新阿伦
  • 10. Re:一款超炫的jquery图片播放插件[Cloud Carousel]
  • 非常非常老的插件了。
  • --新阿伦
  • 11. Re:巧妙利用函数的惰性载入提高javascript 代码性能
  • 第一种在函数体内有函数自身的字面引用, 如果要修改函数命名会很麻烦. 还是第二种更好.
  • --whzx5byb
  • 12. Re:超酷百度百科的页面导航效果,轻松制作---有图有真相!
  • 图片和Css没得下载??? 哪里有附件???
  • --念时
  • 13. Re:巧妙利用函数的惰性载入提高javascript 代码性能
  • 恩,不错
  • --zmcnxd
  • 14. Re:超简单!80行代码实现Google日历(拖放、移动、AJAX)
  • DayPilot确认挺好用的 坐等7.5开源
  • --liuhz
  • 15. Re:简单方法使页面回发后保持焦点
  • 这样不好,这样不好!
    这样是将整个控件存入到session中,而仅仅只是为了一个焦点。
    如果有10个控件,焦点肯定是在其中的某个控件中,这样你让其它没有焦点却也存入session的控件情何以堪。
    而且貌似也没人用session干这个呀!!!
  • --歪脖子
  • 16. Re:超简单!80行代码实现Google日历(拖放、移动、AJAX)
  • @技术狂
    1.LZ这话是不是把代码封装到一个cs里面引用,岂不是需要两行实现了?
    2.上一句开个玩笑,可以实时css3和jquery,几行就搞定了拖放,至于日志,引用一下插件.
  • --flyher
  • 17. Re:80行代码实现Google日历(拖放、移动、AJAX)
  • 头像不错!
  • --美洲象
  • 18. Re:简单方法使页面回发后保持焦点
  • 太笨拙了,每次按键都要触发服务器事件,都有一次服务端交互,另外,20个控件你难道要写20次事件,误人子弟

    session 里面保存的是控件对象,实际应用中不知道是否可行,还是撤出主页吧
  • --James-yu

阅读排行榜

  • 1. 每天前进一厘米-如何快速迎头赶上(919)
  • 2. 超简单!80行代码实现Google日历(拖放、移动、AJAX)(568)
  • 3. 超酷百度百科的页面导航效果,轻松制作---有图有真相!(441)
  • 4. 超级简单的jquery操作表格(添加/删除行、添加/删除列)(362)
  • 5. 超级简单!80行代码实现Google日历(拖放、移动、AJAX)(350)
  • 6. 8个应该去逛逛JQuery的学习网站(350)
  • 7. 分享七个绚丽夺目的JQuery导航(还有苹果、猪八戒等),有图有真相(339)
  • 8. 深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法(309)
  • 9. [JQuery插件系列]-强烈推荐10个非常不错的jQuery工具提示插件(290)
  • 10. 耳目一新!令人膜拜的牛人简历!厉害的攻城师啊(278)
  • 11. 【葵花宝典】程序员技术练级攻略(转)(269)
  • 12. [asp.net入门]利用ADO.NET处理数据的简单之处(261)
  • 13. 巧妙利用jQuery和PHP打造类似360安全卫士防火墙功能开关(类似iphone界面)效果(260)
  • 14. 拍案惊奇!9款神奇的jQuery/CSS3经典插件(259)
  • 15. 2013年度最新最佳CSS网页设计实例(256)
  • 16. 在asp.net中使用jQuery实现类似QQ网站的图片切割效果(249)
  • 17. 一款超炫的jquery图片播放插件[Cloud Carousel](248)
  • 18. 几行JavaScript代码搞定Iframe 自动适应(244)
  • 19. [好文翻译]WEB前端性能优化的14条规则(244)
  • 20. jquery选择器的实现流程简析及提高性能建议!(237)
  • 21. 苦逼的设计师:网页前端的水到底有多深?(237)
  • 22. 某互联网公司流传出的提升代码内外部质量的22条经验(217)
  • 23. 巧妙利用函数的惰性载入提高javascript 代码性能(217)
  • 24. 20个令人惊叹的音乐应用程序UI,值得收藏(214)
  • 25. 码农凑热闹!小米抢购手机页面前端代码分析(204)
  • 26. 十个WEB开发人员不可不知的HTML5工具(193)
  • 27. 基于jQuery的Cookie操作插件--简单而又没有兼容性问题!(186)
  • 28. 使用jQuery动态改变图片显示大小(183)
  • 29. 使用FlexiGrid实现Extjs表格的效果-网络传输小,更方便!(181)
  • 30. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法及优缺点分析(180)
  • 31. 耳目一新!让人膜拜的碉堡个人简历!厉害的攻城师(171)
  • 32. 6个原则、50条秘技提高HTML5应用及网站性能(170)
  • 33. 简单方法使页面回发后保持焦点(168)
  • 34. 可进可退,jQuery图片、视频、flash播放插件prettyPhoto使用记录(164)
  • 35. 两段超简单jquery代码解决iframe自适应高度问题(不用判断浏览器高度)(144)
  • 36. Jquery插件开发学习笔记:简单地入门方法(142)
  • 37. [Ajax] AJAX初体验之-在博客中添加无刷新搜索(140)
  • 38. 凑热闹!小米抢购手机页面前端代码分析(139)
  • 39. 从javascript读取cookies说开去:谈谈网页的本地化存储(133)
  • 40. IE6与CSS样式兼容问题汇总(133)

评论排行榜

  • 1. 简单方法使页面回发后保持焦点(2)
  • 2. 超简单!80行代码实现Google日历(拖放、移动、AJAX)(2)
  • 3. 巧妙利用函数的惰性载入提高javascript 代码性能(2)
  • 4. 超级简单!80行代码实现Google日历(拖放、移动、AJAX)(1)
  • 5. 超酷百度百科的页面导航效果,轻松制作---有图有真相!(1)
  • 6. jquery选择器的实现流程简析及提高性能建议!(1)
  • 7. 8个应该去逛逛JQuery的学习网站(1)
  • 8. 一款超炫的jquery图片播放插件[Cloud Carousel](1)
  • 9. 分享七个绚丽夺目的JQuery导航(还有苹果、猪八戒等),有图有真相(1)
  • 10. 耳目一新!令人膜拜的牛人简历!厉害的攻城师啊(1)
  • 11. 在asp.net中使用jQuery实现类似QQ网站的图片切割效果(1)
  • 12. [好文翻译]WEB前端性能优化的14条规则(1)
  • 13. 两段超简单jquery代码解决iframe自适应高度问题(不用判断浏览器高度)(1)
  • 14. Jquery插件开发学习笔记:简单地入门方法(1)
  • 15. 【Multiple backgrounds】用CSS3实现网页多重背景(1)
  • 16. 眼前一亮!十八款新潮而又独特的网站Header设计(0)
  • 17. 从javascript读取cookies说开去:谈谈网页的本地化存储(0)
  • 18. IE6与CSS样式兼容问题汇总(0)
  • 19. 可进可退,jQuery图片、视频、flash播放插件prettyPhoto使用记录(0)
  • 20. JQuery巧妙利用CSS操作打印样式(0)
  • 21. 使用jQuery动态改变图片显示大小(0)
  • 22. jQuery多媒体播放器插件jQuery Media Plugin使用方法(0)
  • 23. 基于jQuery的Cookie操作插件--简单而又没有兼容性问题!(0)
  • 24. [asp.net入门]利用ADO.NET处理数据的简单之处(0)
  • 25. 8个超级震憾的Jquery图片特效欣赏,考验你的浏览器!(0)
  • 26. 终于开博(0)
  • 27. 每天前进一厘米-如何快速迎头赶上(0)
  • 28. 超级简单的jquery操作表格(添加/删除行、添加/删除列)(0)
  • 29. 几行JavaScript代码搞定Iframe 自动适应(0)
  • 30. 使用FlexiGrid实现Extjs表格的效果-网络传输小,更方便!(0)
  • 31. 说说CSS样式中你不知道的“大于号”(0)
  • 32. 巧妙利用jQuery和PHP打造类似360安全卫士防火墙功能开关(类似iphone界面)效果(0)
  • 33. 深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法(0)
  • 34. 你应该了解的CSS语义化命名方式及常用命名规则(0)
  • 35. 当下流行的响应式布局介绍(0)
  • 36. 十个WEB开发人员不可不知的HTML5工具(0)
  • 37. 码农凑热闹!小米抢购手机页面前端代码分析(0)
  • 38. 6个原则、50条秘技提高HTML5应用及网站性能(0)
  • 39. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法及优缺点分析(0)
  • 40. 凑热闹!小米抢购手机页面前端代码分析(0)

推荐排行榜

  • 1. 8个超级震憾的Jquery图片特效欣赏,考验你的浏览器!(4)
  • 2. 巧妙利用函数的惰性载入提高javascript 代码性能(4)
  • 3. 你应该了解的CSS语义化命名方式及常用命名规则(3)
  • 4. 当下流行的响应式布局介绍(3)
  • 5. 分享七个绚丽夺目的JQuery导航(还有苹果、猪八戒等),有图有真相(3)
  • 6. 超级简单!80行代码实现Google日历(拖放、移动、AJAX)(3)
  • 7. [asp.net入门]利用ADO.NET处理数据的简单之处(3)
  • 8. 二十个在线编程学习网站(2)
  • 9. [JQuery插件系列]-强烈推荐10个非常不错的jQuery工具提示插件(2)
  • 10. 耳目一新!令人膜拜的牛人简历!厉害的攻城师啊(2)
  • 11. 在asp.net中使用jQuery实现类似QQ网站的图片切割效果(2)
  • 12. [好文翻译]WEB前端性能优化的14条规则(2)
  • 13. 眼前一亮!十八款新潮而又独特的网站Header设计(2)
  • 14. 巧妙利用jQuery和PHP打造类似360安全卫士防火墙功能开关(类似iphone界面)效果(2)
  • 15. jquery选择器的实现流程简析及提高性能建议!(2)
  • 16. 超级简单的jquery操作表格(添加/删除行、添加/删除列)(2)
  • 17. 使用FlexiGrid实现Extjs表格的效果-网络传输小,更方便!(2)
  • 18. 超简单!80行代码实现Google日历(拖放、移动、AJAX)(2)
  • 19. jQuery多媒体播放器插件jQuery Media Plugin使用方法(2)
  • 20. 8个应该去逛逛JQuery的学习网站(2)
  • 21. 一款超炫的jquery图片播放插件[Cloud Carousel](2)
  • 22. 基于jQuery的Cookie操作插件--简单而又没有兼容性问题!(2)
  • 23. 十个WEB开发人员不可不知的HTML5工具(2)
  • 24. 码农凑热闹!小米抢购手机页面前端代码分析(2)
  • 25. 6个原则、50条秘技提高HTML5应用及网站性能(2)
  • 26. 【葵花宝典】程序员技术练级攻略(转)(2)
  • 27. 20个令人惊叹的音乐应用程序UI,值得收藏(1)
  • 28. 深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法(1)
  • 29. 利用CSS、JavaScript及Ajax实现图片预加载的三大方法及优缺点分析(1)
  • 30. 凑热闹!小米抢购手机页面前端代码分析(1)
  • 31. 2013年度最新最佳CSS网页设计实例(1)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多