cookie.js(设置名值对属性时候不支持设置成前后有空格的格式,如' key'或'key ',只支持‘key’)

(function initCookieClass(win){// 定义匿名函数并在定以后立即调用(function(){}()),圆括号保证并正确解析成函数
var Cookie=function Cookie(maxage,path){// Cookie构造函数
// 私有属性,将document.cookie解析成JSON对象
var cookie=(function(ck){
var cookie={};
var all=ck;
if(all==='') return cookie; // 返回空值对象
// document.cookie以key1=value1;key2=value2的格式存储数据
var list=all.split(';');
for (var i = 0; i < list.length; i++) {
var c=list[i];
var p=c.indexOf('=');
var name=c.substring(0,p);
// cookie存储中第一个名值对没有空格,第二个开始都有空格,做清除空格操作
if(name && typeof name==='string') name=name.replace(/^\s|\s%/,'');
var value=c.substring(p+1);
// 对名值对进行解码,一般只要对值进行编解码,主要是对中文的处理
name=decodeURIComponent(name);
value=decodeURIComponent(value);
cookie[name]=value;
}
return cookie;
}(win.document.cookie));
// 私有属性,keysSet
var keys=[];
for(var key in cookie) keys.push(key);
// 自有属性,length表示cookie的对象数
this.length=keys.length;
// 实例方法,根据索引值返回cookie值,在根据长度遍历时候使用
this.key=function(n){
if(n<0||n>keys.length) return null;
return cookie[n];
};
// 实例方法,根据key获取value
this.getItem=function(name){
return cookie[name]||null;
};
// 实例方法,设置cookie属性,以名值对的格式
this.setItem=function(key,value){
if(!key) {
for(var k in value) {
this.setItem(k, value[k]);
}
return;
}
if(!(key in cookie)) {
keys.push(key);
this.length++;
}
cookie[key]=value;
var c=encodeURIComponent(key)+'='+encodeURIComponent(value);
if(maxage) c+=';max-age='+maxage;
if(path) c+=';path='+path;
win.document.cookie=c;
return this;
};
// 实例方法,根据key删除value
this.removeItem=function(key){
if(!(key in cookie)) return;
delete cookie[key];
for (var i = 0; i < keys.length; i++) {
if(keys[i]===key) {
keys.splice(i,1);
break;
}
}
this.length--;
win.document.cookie=encodeURIComponent(key)+'=;max-age=0';
return this;
};
// 实例方法,清除掉cookie数据和此对象数据
this.clear=function(){
for (var i = 0; i < keys.length; i++) {
win.document.cookie=encodeURIComponent(keys[i])+'=;max-age=0';
}
cookie={};
keys=[];
this.length=0;
return this;
};
// 实例方法,重新从浏览器中获取cookie数据
this.sync=function(){
cookie=(function(){
var cookie={};
var all=win.document.cookie;
if(all==='') return cookie;
var list=all.split(';');
for (var i = 0; i < list.length; i++) {
var c=list[i];
var p=c.indexOf('=');
var name=c.substring(0,p);
if(name && typeof name==='string') name=name.replace(/^\s|\s%/,'');
if(name) name=name.replace(/^\s|\s%/,'');
var value=c.substring(p+1);
name=decodeURIComponent(name);
value=decodeURIComponent(value);
cookie[name]=value;
}
return cookie;
}());
keys=[];
for(var key in cookie) keys.push(key);
this.length=keys.length;
return this;
};
// 实例方法,返回cookie的JSON格式
// 因为cookie是私有属性,在函数体闭包内用val声明的变量,在函数体外是无法直接访问的
this.getCookieJSON=function(){
return cookie;
};
};
win.Cookie=Cookie;
win.cookie=new Cookie();
}(window));

cookie.html,简单测试一下

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cookie Test</title>
<script type="text/javascript" src="cookie.js"></script>
<script type="text/javascript">
(function(w){
w.onload=function(){
if(cookie) {
// 增,改
cookie.setItem('test','success');
// 查
var result=cookie.getItem('test');
console.log('test:'+result);
// 删
cookie.removeItem('test');
// 支持JSON格式的存储方案
cookie.setItem(null,{'one':1,'two':2});
// 根据JSON格式查找
result=cookie.getCookieJSON();
console.log('cookie for json:');
for(var i in result) {
console.log('\n'+i+':'+result[i]);
}
} else {
throw new Error('Create cookie instance failure.');
}
};
}(window));
</script>
</head>
<body> </body>
</html>

默认cookie对象的生命周期是Web浏览器的会话期(session),与sessionStorage的作用域不同,cookie是整个浏览器进程,而不是单个窗口的进程。不同标签页可以共用,除非显示设置。

几乎所有的浏览器都支持cookie。

参考文献:《JavaScript权威指南》  --O‘REILLY[第六版]

cookie自封装对象的更多相关文章

  1. java中基本类型封装对象所占内存的大小(转)

    这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...

  2. DES加密解密 与 Cookie的封装(C#与js互相加密解密)

    2D JS框架 - DES加密解密 与 Cookie的封装(C#与js互相加密解密)   这次实现了JS端的DES加密与解密,并且C#端也能正确解析DES的密文(反之也实现了) 使用的代码如下,非常方 ...

  3. 当使用cokie进行数据交互时候,cookie只需存储该对象的id即可不需要存放其他数据;只需在写个接口根据cookie里面的对象id来创建对象

    当使用cokie进行数据交互时候,cookie只需存储该对象的id即可不需要存放其他数据:只需在写个接口根据cookie里面的对象id来创建对象

  4. dbutils封装对象,单列,一行一列(用)

    基本用法:查找并封装对象与对象集合 public User findUserByNamePassword(String name,String password){ QueryRunner runne ...

  5. javascript jquery封装对象时的错误,求解!我想知道为什么

    jquery   封装对象时的错误 --------------------------------------------<input id="name" name=&qu ...

  6. day17-Python运维开发基础(类的封装 / 对象和类的相关操作、构造方法)

    1. 类的封装及相关操作 # ### oop 面向对象程序开发 """ #用几大特征表达一类事物称为一个类,类更像是一张图纸,表达的是一个抽象概念 "" ...

  7. ArrayList集合存储VO封装对象后调用的问题

    VO代码: public class VO4Blog { private int b_id; private int b_typeid; private String b_title; private ...

  8. JavaScript基础原始数据类型的封装对象(013)

    JavaScript提供了5种原始数据类型:number, string, boolean, null, and undefined.对于前面3个,即number, string, 和boolean提 ...

  9. day22:面向对象封装对象操作&类操作&面向对象删除操作

    面向对象程序开发 1.类的三种定义方式 class MyClass: pass class MyClass(): #(推荐) pass class MyClass(object): # object类 ...

随机推荐

  1. 动态代理写connection连接池Demo

    public class JdbcUtil2 { //声明连接池<放到LinkedList中,操作其中对象的速度快 只需要改变连接> private static LinkedList&l ...

  2. Google的Guava工具类splitter和apache stringutil对比 编辑

    一直用的是apache的stringutil工具类,其实google的工具类项目 guava中居然也有字符串的分隔类splitter的,在 http://code.google.com/p/guava ...

  3. jquery easyui+layer后台框架

    最近使用jquery easyui搭建了一个后台框架,以方便以后使用 上图先: 下载地址:CSDN下载

  4. 17--Box2D使用(三、触摸交互)

    Box2D引擎与触摸的交互通过创建鼠标关节以及碰撞检测来得到触摸点下面的刚体,在根据触摸操作完成相应的功能.首先添加触摸响应函数声明 virtual void ccTouchesBegan(cocos ...

  5. 基于Http原理实现Android的图片上传和表单提交

    版权声明:本文由张坤  原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/794875001483009140 来源:腾云阁  ...

  6. IOS流媒体播放

    IOS流媒体播放   1. 这里的流媒体地址是指服务端那边已经调好格式的可以在ios上播放的视频流. 下面提供几个视频流的地址: NSString *linkStr = http://61.160.2 ...

  7. word2vec的艰难成长史

    1.首先在网站上面下载gensim,我是在11服务器上面下载的 2.使用winpython打开 3.在command windows 下使用pip install gensim这句话进行,原先使用这句 ...

  8. 怎么通过网站优化来增强SEO效果?

    真正好的网站优化不应该针对哪一个搜索引擎,而应该关注用户的需求.搜索引擎把这这用户指标权重提升,实际上也是希望把更多的精力集中在用户体验的提升上面.那么,这些用户指标应该怎样提升呢?方法多种多样,下面 ...

  9. 宏汇编软件MASM51的使用

    单片机开发可以用手工汇编和机器汇编两种方法.采用手工汇编就是先编写出汇编程序,然后对照单片机汇编表手工将汇编程序翻译成机器码,最后将机器码一个一个地送入开发仿真器的RAM中去进行调试. 由于采用手工汇 ...

  10. KEIL UV3中光标不对齐解决

    Keil uVision3与uV2相比增加了对更多型号单片机的支持,另外还对一些的方面进行了优化.不过它却优化出一个让人头疼的问题,那就是光标位置显示不正确!这一问题给程序的编写带来了许多不便.不过不 ...