JavaScript的Cookies


Posted in Javascript onJanuary 16, 2008

使用 Cookies

我们已经知道,在 document 对象中有一个 cookie 属性。但是 Cookie 又是什么?“某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称为 Cookie。”—— MSIE 帮助。一般来说,Cookies 是 CGI 或类似,比 HTML 高级的文件、程序等创建的,但是 JavaScript 也提供了对 Cookies 的很全面的访问权利。

在继续之前,我们先要学一学 Cookie 的基本知识。

每个 Cookie 都是这样的:<cookie名>=<值>

<cookie名>的限制与 JavaScript 的命名限制大同小异,少了“不能用 JavaScript 关键字”,多了“只能用可以用在 URL 编码中的字符”。后者比较难懂,但是只要你只用字母和数字命名,就完全没有问题了。<值>的要求也是“只能用可以用在 URL 编码中的字符”。

每个 Cookie 都有失效日期,一旦电脑的时钟过了失效日期,这个 Cookie 就会被删掉。我们不能直接删掉一个 Cookie,但是可以用设定失效日期早于现在时刻的方法来间接删掉它。

每个网页,或者说每个站点,都有它自己的 Cookies,这些 Cookies 只能由这个站点下的网页来访问,来自其他站点或同一站点下未经授权的区域的网页,是不能访问的。每一“组”Cookies 有规定的总大小(大约 2KB 每“组”),一超过最大总大小,则最早失效的 Cookie 先被删除,来让新的 Cookie“安家”。

现在我们来学习使用 document.cookie 属性。

如果直接使用 document.cookie 属性,或者说,用某种方法,例如给变量赋值,来获得 document.cookie 的值,我们就可以知道在现在的文档中有多少个 Cookies,每个 Cookies 的名字,和它的值。例如,在某文档中添加“document.write(document.cookie)”,结果显示:

name=kevin; email=kevin@kevin.com; lastvisited=index.html

这意味着,文档包含 3 个 Cookies:name, email 和 lastvisited,它们的值分别是 kevin, kevin@kevin.com 和 index.html。可以看到,两个 Cookies 之间是用分号和空格隔开的,于是我们可以用 cookieString.split('; ') 方法得到每个 Cookie 分开的一个数组(先用 var cookieString = document.cookie)。

设定一个 Cookie 的方法是对 document.cookie 赋值。与其它情况下的赋值不同,向 document.cookie 赋值不会删除掉原有的 Cookies,而只会增添 Cookies 或更改原有 Cookie。赋值的格式:

document.cookie = 'cookieName=' + escape('cookieValue')
     + ';expires=' + expirationDateObj.toGMTString();

是不是看到头晕了呢?以上不是粗体字的地方是要照抄不误的,粗体字是要按实际情况做出改动的。cookieName 表示 Cookie 的名称,cookieValue 表示 Cookie 的值,expirationDateObj 表示储存着失效日期的日期对象名,如果不需要指定失效日期,则不需要第二行。不指定失效日期,则浏览器默认是在关闭浏览器(也就是关闭所有窗口)之后过期。

看到了上面的一些下划线了么?这些是应该注意的地方。

首先 escape() 方法:为什么一定要用?因为 Cookie 的值的要求是“只能用可以用在 URL 编码中的字符”。我们知道“escape()”方法是把字符串按 URL 编码方法来编码的,那我们只需要用一个“escape()”方法来处理输出到 Cookie 的值,用“unescape()”来处理从 Cookie 接收过来的值就万无一失了。而且这两个方法的最常用途就是处理 Cookies。其实设定一个 Cookie 只是“document.cookie = 'cookieName=cookieValue'”这么简单,但是为了避免在 cookieValue 中出现 URL 里不准出现的字符,还是用一个 escape() 好。

然后“expires”前面的分号:注意到就行了。是分号而不是其他。

最后 toGMTString() 方法:设定 Cookie 的时效日期都是用 GMT 格式的时间的,其它格式的时间是没有作用的。

现在我们来实战一下。设定一个“name=rose”的 Cookie,在 3 个月后过期。

var expires = new Date();
expires.setTime(expires.getTime() + 3 * 30 * 24 * 60 * 60 * 1000);
/*   三个月 x 一个月当作 30 天 x 一天 24 小时
   x 一小时 60 分 x 一分 60 秒 x 一秒 1000 毫秒 */
document.cookie = 'name=rose;expires=' + expires.toGMTString();

为什么没有用 escape() 方法?这是因为我们知道 rose 是一个合法的 URL 编码字符串,也就是说,'rose' == escape('rose')。一般来说,如果设定 Cookie 时不用 escape(),那获取 Cookie 时也不用 unescape()。

再来一次:编写一个函数,作用是查找指定 Cookie 的值。

function getCookie(cookieName) {
  var cookieString = document.cookie;
  var start = cookieString.indexOf(cookieName + '=');
  // 加上等号的原因是避免在某些 Cookie 的值里有
  // 与 cookieName 一样的字符串。
  if (start == -1) // 找不到
    return null;
  start += cookieName.length + 1;
  var end = cookieString.indexOf(';', start);
  if (end == -1) return unescape(cookieString.substring(start));
  return unescape(cookieString.substring(start, end));
}

这个函数用到了字符串对象的一些方法,如果你不记得了(你是不是这般没记性啊),请快去查查。这个函数所有的 if 语句都没有带上 else,这是因为如果条件成立,程序运行的都是 return 语句,在函数里碰上 return,就会终止运行,所以不加 else 也没问题。该函数在找到 Cookie 时,就会返回 Cookie 的值,否则返回“null”。

现在我们要删除刚才设定的 name=rose Cookie。

var expires = new Date();
expires.setTime(expires.getTime() - 1);
document.cookie = 'name=rose;expires=' + expires.toGMTString();

可以看到,只需要把失效日期改成比现在日期早一点(这里是早 1 毫秒),再用同样的方法设定 Cookie,就可以删掉 Cookie 了。

Javascript 相关文章推荐
鼠标移动到一张图片时变为另一张图片
Dec 05 Javascript
DLL+ ActiveX控件+WEB页面调用例子
Aug 07 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
Oct 18 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
Sep 27 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
Mar 30 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
May 07 Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 Javascript
Vue 过渡实现轮播图效果
Mar 27 Javascript
微信小程序之网络请求简单封装实例详解
Jun 28 Javascript
Node.js利用断言模块assert进行单元测试的方法
Sep 28 Javascript
详解如何创建并发布一个 vue 组件
Nov 08 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 Javascript
JavaScript中的对象化编程
Jan 16 #Javascript
JavaScript中的事件处理
Jan 16 #Javascript
JavaScript中的其他对象
Jan 16 #Javascript
JavaScript中的Document文档对象
Jan 16 #Javascript
JavaScript中的Location地址对象
Jan 16 #Javascript
JavaScript中的History历史对象
Jan 16 #Javascript
JavaScript中的Window窗口对象
Jan 16 #Javascript
You might like
PHP 高级课程笔记 面向对象
2009/06/21 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
jquery 指南/入门基础
2007/11/30 Javascript
js 格式化时间日期函数小结
2010/03/20 Javascript
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
python打印异常信息的两种实现方式
2019/12/24 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
大学生饮食配送创业计划书
2014/01/04 职场文书
火锅店营销方案
2014/02/26 职场文书
元旦晚会主持词
2014/03/24 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
2014年档案管理工作总结
2014/11/17 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
MySQL8.0.24版本Release Note的一些改进点
2021/04/22 MySQL
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle
win10系统xps文件怎么打开?win10打开xps文件的两种操作方法
2022/07/23 数码科技