原生js操作cookie
创建和存储 cookie
在这个例子中我们要创建一个存储访问者名字的 cookie。当访问者首次访问网站时,他们会被要求填写姓名。名字会存储于 cookie 中。当访问者再次访问网站时,他们就会收到欢迎词。
首先,我们会创建一个可在 cookie 变量中存储访问者姓名的函数:
function setCookie(c_name,value,expires){
var exdate=new Date();
exdate.setTime(exdate.getTime()+expires);
document.cookie=c_name+ "=" +escape(value)+((expires==null) ? "" : ";expires="+exdate.toGMTString());
}
上面这个函数中的参数存有 cookie 的名称、值以及过期天数。
setTime() 方法以毫秒设置 Date 对象,时间戳13位。这里如果要设置为30天,则expiredays为30*24*60*60*1000
;也可以使用exdate.setDate(exdate.getDate()+expiredays)
,expiredays直接使用天数:
function setCookie(c_name,value,expiredays){
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString());
}
在上面的函数中,我们首先将天数转换为有效的日期,然后,我们将 cookie 名称、值及其过期日期存入 document.cookie 对象。
注意,如果执行setCookie('test', 123)
之后,默认的cookie状态是:
name:test
value: 123
domain: www.cnblogs.com
path: /52fhy/p/
expires: Session(即关闭当前会话cookie就失效了)
size:6
所以实际情况下,我们还得设置domain,path,expires。文章后面提供优化方法。
获取cookie
之后,我们要创建另一个函数来检查是否已设置 cookie。
function getCookie(c_name){
if (document.cookie.length>0)
{
c_start=document.cookie.indexOf(c_name + "=");
if (c_start!=-1){
c_start=c_start + c_name.length+1;
c_end=document.cookie.indexOf(";",c_start);
if (c_end==-1) c_end=document.cookie.length;
return unescape(document.cookie.substring(c_start,c_end));
}
}
return ""
}
上面的函数首先会检查 document.cookie 对象中是否存有 cookie。假如 document.cookie 对象存有某些 cookie,那么会继续检查我们指定的 cookie 是否已储存。如果找到了我们要的 cookie,就返回值,否则返回空字符串。
获取所有cookie
console.log(document.cookie);
删除cookie
function delCookie(name)
{
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval=getCookie(name);
if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();
}
指定可访问cookie的路径
默认情况下,如果在某个页面创建了一个cookie,那么该页面所在目录中的其他页面也可以访问该cookie。如果这个目录下还有子目录,则在子目录中也可以访问。例如在www.xxxx.com/html/a.html中所创建的cookie,可以被www.xxxx.com/html/b.html或www.xxx.com/ html/ some/c.html所访问,但不能被www.xxxx.com/d.html访问。
为了控制cookie可以访问的目录,需要使用path参数设置cookie,语法如下:
document.cookie="name=value; path=cookieDir";
其中cookieDir表示可访问cookie的目录。例如:
document.cookie="userId=320; path=/shop";
就表示当前cookie仅能在shop目录下使用。
如果要使cookie在整个网站下可用,可以将cookie_dir指定为根目录,例如:
代码如下:
document.cookie="userId=320; path=/";
指定可访问cookie的主机名
和路径类似,主机名是指同一个域下的不同主机,例如:www.google.com和gmail.google.com就是两个不同的主机名。默认情况下,一个主机中创建的cookie在另一个主机下是不能被访问的,但可以通过domain参数来实现对其的控制,其语法格式为:
document.cookie="name=value; domain=cookieDomain";
以google为例,要实现跨主机访问,可以写为:
document.cookie="name=value;domain=.google.com";
这样,所有google.com下的主机都可以访问该cookie。
domain的设置,有几点要注意:
1.在setcookie中省略domain参数,那么domain默认为当前域名。
2.domain参数可以设置父域名以及自身,但不能设置其它域名,包括子域名,否则cookie不起作用。
那么cookie的作用域:
cookie的作用域是domain本身以及domain下的所有子域名。
cookie作用域必须有效,js里包括localhost,错误的不生效。php里cookie作用域不能是localhost,设置为空或者false。
总结
cookie的处理过程比较复杂,并具有一定的相似性。因此可以定义几个函数来完成cookie的通用操作,从而实现代码的复用。
例如设置cookie,这里针对上面的进行优化:
function setCookie(c_name,value,expires,path, domain){
var exdate=new Date();
exdate.setTime(exdate.getTime()+expires);
var expires = (expiredays==null) ? "" : ";expires="+exdate.toGMTString();
var path = (path == null) ? ";path=/" : ";path="+path;
var domain = (domain == null) ? "" : ";domain=."+domain;
document.cookie=c_name+ "=" +escape(value)+expires + path + domain;
}
我们再次执行setCookie('test2',123,1*24*3600*1000, '/', 'cnblogs.com')
之后,默认的cookie状态是:
name:test2
value: 123
domain: .cnblogs.com
path: /
expires: 不再是Session,而是具体的失效时间
size:8
当然,我们也可以使用第三方库处理。
使用第三方库操作cookie
zepto:https://github.com/kennx/Zepto-Cookie
jquery:https://github.com/carhartl/jquery-cookie
zepto版本的修改来自jquery版本。所以用法两者类似。
用法
格式: $.fn.cookie(key, value, options);
key (string), 键名.
value (string), 键值.
options (object), 设置expires, path, or domain等.
示例
$.fn.cookie('foo', 'bar'); //设置cookie
$.fn.cookie('foo'); //获取cookie
$.fn.cookie('foo', 'bar', { expires: 7 }); //设置cookie,有效期7天
可选项
{ expires : 7 } //有效期天数,若为空则设置缺省,即仅当前会话有效
{ path: '/foo' }//存储路径,若为空则设置缺省,即当前路径
{ domain: 'example.com' } //域名,若为空则设置缺省,即当前域名
{ secure: true } //Whether the cookie requries a secure connection (https). Defaults to false.
{ raw: true } //Whether or not to URI encode the cookie value. Defaults to false.
参考
1、JS设置Cookie过期时间 - 小角色 - 博客园
http://www.cnblogs.com/chenou/articles/1128040.htm
2、Expires和max-age的区别 - Robin99 - 博客园
http://www.cnblogs.com/yinhaiming/articles/1490811.html
3、js中cookie的使用详细分析_javascript技巧_脚本之家
http://www.jb51.net/article/14566.htm
js里cookie操作的更多相关文章
-
JS封装cookie操作函数实例(设置、读取、删除)
本文实例讲述了JS封装cookie操作函数.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...
-
Jquery和js实现cookie操作手机浮层广告;附加:js获取、添加、删除cookie
1.jquery cookie包实现手机上的浮层广告 <span style="font-size:18px;">$(document).ready(function( ...
-
js中cookie操作
js中操作Cookie的几种常用方法 * cookie中存在域的概念,使用path和domain区分: * 在同一域中的set和del可以操作同一名称的cookie,但不在同一域中的情况下,则set无 ...
-
关于JS 的cookie 操作 与 json 的数据结构 问题
今天写了一个购物车,由于购物车内容是保存在 cookie中 所以不想浪费服务器资源做cookie的操作 故在前端封装了一些对象来处理购物车,由于cookie的数据结构的设计是一个json格式 使用 账 ...
-
js之cookie操作
1.使用document.cookie保存信息 document.cookie = "Test=cooo";alert(document.cookie); //hours为空字符串 ...
-
js里cookie,localStorage的简单用法
cookie的使用场景---->注册功能(注册成功后,将账号和密码存入cookie里,在登录时显示到输入框里) 注册的js(将数据存入cookie): escape和unescap ...
-
js封装Cookie操作 js 获取cookie js 设置cookie js 删除cookie
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code var CookieUtil = { // 设置cookie set : functi ...
-
js封装Cookie操作
var CookieUtil = { // 设置cookie set : function (name, value, expires, domain, path, secure) { var coo ...
-
js的cookie操作及知识点详解
<html> <head> <script type="text/javascript"> function getCookie(c_name) ...
随机推荐
-
JVM实用参数(八)GC日志
本系列的最后一部分是有关垃圾收集(GC)日志的JVM参数.GC日志是一个很重要的工具,它准确记录了每一次的GC的执行时间和执行结果,通过分析GC日志可以优化堆设置和GC设置,或者改进应用程序的对象分配 ...
-
hive 记事本
hive 0.12 load data overwrite 直接覆盖了数据,不进回收站..... 手动load data 不加overwrite
-
$_ 与 $PSItem
PowerShell 3.0 中的$PSItem 此文章于2012年11月4日发表在PowershellPowershell小技巧并加以Powershell 3.0管道的标签 by Mooser Le ...
-
java读取excel文件数据
package com.smp.server.Ctrl; import java.io.File;import java.io.FileInputStream;import java.io.FileN ...
-
学习总结 html一般标签的使用
body的属性: bgcolor 页面背景色 background 背景壁纸.图片 text 文字颜色 topmargin 上边距 leftmargin 左边距 rightmargin 右边 ...
-
PDF 补丁丁 0.6.0.3369 版发布(修复保存文件时文件名替代符失效的问题)
新的测试版修复之前测试版本在保存文件时文件名替代符失效的问题
-
Python校验文件MD5值
import hashlib import os def GetFileMd5(filename): if not os.path.isfile(filename): return myHash = ...
-
layui轮播中箭头不起作用问题
layui轮播中箭头不起作用问题 layui轮播插件在使用中发现箭头不起作用其他都合适,是什么原因造成的呢?发现单独提出layui中的demo是合适的,通过仔细慢慢的寻找,发现layui.use('c ...
-
C++获取数组的长度
C++获取数组的长度 #include<iostream> using namespace std; template<class T> int length(T& a ...
-
centos7修改hostname
[root@centos7 ~]$ hostnamectl set-hostname prd_web1 # 使用这个命令会立即生效且重启也生效 [root@centos7 ~]$ hostname # ...