使用原生 cookieStore 方法,让 Cookie 操作更简单
前言
对于前端来讲,我们在操作cookie
时往往都是基于document.cookie
,但它有一个缺点就是操作复杂,它并没有像localStorage
那样提供一些get
或set
等方法供我们使用。对与cookie的操作一切都是基于字符串来进行的。为了让cookie
的操作更简便, Chrome87率先引入了cookieStore
方法。
document.cookie
document.cookie
可以获取并设置当前文档关联的cookie
获取cookie
const cookie = document.cookie
在上面的代码中,cookie
被赋值为一个字符串,该字符串包含所有的 Cookie,每条 cookie 以"分号和空格 (; )"分隔 (即, key=value
键值对)。
但这拿到的是一整个字符串,如果你想获取cookie中的某一个字段,还需要自己处理
const converter = {
read: function (value) {
if (value[0] === '"') {
value = value.slice(1, -1);
}
return value.replace(/(%[\dA-F]{2})+/gi, decodeURIComponent)
},
write: function (value) {
return encodeURIComponent(value).replace(
/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,
decodeURIComponent
)
}
}
function getCookie (key) {
const cookies = document.cookie ? document.cookie.split('; ') : [];
const jar = {};
for (let i = 0; i < cookies.length; i++) {
const parts = cookies[i].split('=');
const value = parts.slice(1).join('=');
try {
const foundKey = decodeURIComponent(parts[0]);
jar[foundKey] = converter.read(value, foundKey);
if (key === foundKey) {
break
}
} catch (e) {}
}
return key ? jar[key] : jar
}
console.log(getCookie('name')) // 前端南玖
比如上面这段代码就是用来获取单个cookie
值的
设置cookie
document.cookie = `name=前端南玖;`
它的值是一个键值对形式的字符串。需要注意的是,用这个方法一次只能对一个 cookie 进行设置或更新。
比如:
document.cookie = `age=18; city=shanghai;`
这样只有age
能够设置成功
以下可选的 cookie 属性值可以跟在键值对后,用来具体化对 cookie 的设定/更新,使用分号以作分隔:
;path=path
(例如 '/', '/mydir') 如果没有定义,默认为当前文档位置的路径。;domain=domain
(例如 'example.com', 'subdomain.example.com') 如果没有定义,默认为当前文档位置的路径的域名部分。与早期规范相反的是,在域名前面加 . 符将会被忽视,因为浏览器也许会拒绝设置这样的 cookie。如果指定了一个域,那么子域也包含在内。;max-age=max-age-in-seconds
(例如一年为 606024*365);expires=date-in-GMTString-format
如果没有定义,cookie 会在对话结束时过期
- 这个值的格式参见Date.toUTCString() (en-US)
;secure
(cookie 只通过 https 协议传输)
cookie 的值字符串可以用encodeURIComponent() (en-US)来保证它不包含任何逗号、分号或空格 (cookie 值中禁止使用这些值).
function assign (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
target[key] = source[key];
}
}
return target
}
function setCookie (key, value, attributes) {
if (typeof document === 'undefined') {
return
}
attributes = assign({}, { path: '/' }, attributes);
if (typeof attributes.expires === 'number') {
attributes.expires = new Date(Date.now() + attributes.expires * 864e5);
}
if (attributes.expires) {
attributes.expires = attributes.expires.toUTCString();
}
key = encodeURIComponent(key)
.replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)
.replace(/[()]/g, escape);
var stringifiedAttributes = '';
for (var attributeName in attributes) {
if (!attributes[attributeName]) {
continue
}
stringifiedAttributes += '; ' + attributeName;
if (attributes[attributeName] === true) {
continue
}
stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];
}
return (document.cookie =
key + '=' + converter.write(value, key) + stringifiedAttributes)
}
setCookie('course', 'fe', { expires: 365 })
这里是js-cookie
库对setCookie
方法的封装
删除cookie
function removeCookie (key, attributes) {
setCookie(
key,
'',
assign({}, attributes, {
expires: -1
})
);
}
removeCookie('course')
新方法cookieStore
以上就是通过document.cookie
来操作cookie
的方法,未封装方法之前操作起来都非常的不方便。现在我们再来了解一下新方法cookieStore
,它是一个类似localStorage
的全局对象。
它提供了一些方法可以让我们更加方便的操作cookie
获取单个cookie
cookieStore.get(name)
该方法可以获取对应key
的单个cookie,并且以promise
形式返回对应的值
async function getCookie (key) {
const name = await cookieStore.get(key)
console.log('【name】', name)
}
getCookie('name')
当获取的cookie
不存在时,则会返回null
获取所有cookie
cookieStore.getAll()
该方法可以获取所有匹配的cookie
,并且以promise
形式返回一个列表
async function getAllCookies () {
const cookies = await cookieStore.getAll()
console.log('【cookies】', cookies)
}
getAllCookies()
当cookie
不存在时,则会返回一个空数组
设置cookie
cookieStore.set()
该方法可以设置cookie,并且会返回一个promise状态,表示是否设置成功
function setCookie (key, value) {
cookieStore.set(key, value).then(res => {
console.log('设置成功')
}).catch(err => {
console.log('设置失败')
})
}
setCookie('site', 'https://bettersong.github.io/nanjiu/')
如果想要设置更多的属性,比如:过期时间、路径、域名等,可以传入一个对象
function setCookie (key, value) {
cookieStore.set({
name: key,
value: value,
path: '/',
expires: new Date(2024, 2, 1)
}).then(res => {
console.log('设置成功')
}).catch(err => {
console.log('设置失败')
})
}
setCookie('site', 'https://bettersong.github.io/nanjiu/')
删除cookie
cookieStore.delete(name)
该方法可以用来删除指定的cookie,同样会返回一个promise状态,来表示是否删除成功
function removeCookie (key) {
cookieStore.delete(key).then(res => {
console.log('删除成功')
}).catch(err => {
console.log('删除失败')
})
}
removeCookie('site')
需要注意的是:即使删除一个不存在的cookie也会返回删除成功状态
监听cookie
cookieStore.addEventListener('change', (event) => {
console.log(event)
});
可以通过change
事件来监听cookie的变化,无论是通过cookieStore
操作的,还是通过document.cookie
来操作的都能够监听到。
该方法的返回值有两个字段比较重要,分别是:change
盒delete
,它们都是数组类型。用来存放改变和删除的cookie信息
监听修改
调用set
方法时,会触发change
事件,修改或设置的cookie会存放在change
数组中
cookieStore.addEventListener('change', (event) => {
const type = event.changed.length ? 'change' : 'delete';
const data = (event.changed.length ? event.changed : event.deleted).map((item) => item.name);
console.log(`【${type}】, cookie:${JSON.stringify(data)}`);
});
function setCookie (key, value) {
cookieStore.set(key, value).then(res => {
console.log('设置成功')
}).catch(err => {
console.log('设置失败')
})
}
setCookie('site', 'https://bettersong.github.io/nanjiu/')
️需要注意的是:
通过
document.cookie
设置或删除cookie时,都是会触发change
事件,不会触发delete
事件即使两次设置cookie的
name
和value
都相同,也会触发change
事件
监听删除
调用delete
方法时,会触发change
事件,删除的cookie会存放在delete
数组中
cookieStore.addEventListener('change', (event) => {
const type = event.changed.length ? 'change' : 'delete';
const data = (event.changed.length ? event.changed : event.deleted).map((item) => item.name);
console.log(`【${type}】, cookie:${JSON.stringify(data)}`);
});
function removeCookie (key) {
cookieStore.delete(key).then(res => {
console.log('删除成功')
}).catch(err => {
console.log('删除失败')
})
}
removeCookie('site')
️需要注意的是:
- 如果删除一个不存在的cookie,则不会触发
change
事件
兼容性
在使用该方法时需要注意浏览器的兼容性
总结
cookieStore
提供的方法比起直接操作document.cookie
要简便许多,不仅支持增删改查,还支持通过change事件来监听cookie的变化,但是在使用过程需要注意兼容性问题。
使用原生 cookieStore 方法,让 Cookie 操作更简单的更多相关文章
- 分享几个日常调试方法让js调试更简单
下面分享几个日常调试代码的时候在Console命令行显示你的操作,让你的js调试更简单. console显示信息的命令 在浏览器按f12在console上显示你的文本. <!DOCTYPE ht ...
- 基于jQuery的Cookie操作插件--简单而又没有兼容性问题!
在网页客户端,我们经常会遇到读取或者设置cookie的情况,如果用纯生的js我们可能会遇到一些兼容性带来的麻烦,这里给大家介绍一个比较实用jquery操作cookie的插件,插件的源代码如下: 1 2 ...
- .net 多播委托的使用方法以及场景,更简单的观察者模式
首先来说一下什么是多播委托 多播委托就是在委托里定义一个或者多个方法的一个集合 使用方法: public Action actList; //添加方法 public void AddActionMet ...
- Vue之cookie操作(原生)
Vue之cookie操作(原生) 再vue组件中加入以下几个方法,然后调用即可. methods:{ //读取cookie,需要注意的是cookie是不能存中文的,如果需要存中文,解决方法是后端先进行 ...
- 原生JavaScript常用本地浏览器存储方法二(cookie)
JavsScript Cookie概述 cookie是浏览器提供的一种机制,它将document对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是Jav ...
- js 判断js函数、变量是否存在 JS保存和删除cookie操作,判断cookie是否存在的方法
//是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof(eval(funcName)) == " ...
- js实用方法记录-简单cookie操作
js实用方法记录-简单cookie操作 设置cookie:setCookie(名称,值,保存时间,保存域); 获取cookie:setCookie(名称); 移除cookie:setCookie(名称 ...
- cookie操作大全
JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...
- 学习笔记: JavaScript/JQuery 的cookie操作
转自:http://blog.csdn.net/barryhappy/archive/2011/04/27/6367994.aspx cookie是网页存储到用户硬盘上的一小段信息.最常见的作用是判断 ...
- 【WebView】Android WebView中的Cookie操作
Hybrid App(混合式应用)的开发过程中少不了与WebView的交互,在涉及到账户体系的产品中,包含了一种登录状态的传递.比如,在Native(原生)界面的登录操作,进入到Web界面时,涉及到账 ...
随机推荐
- Windows 磁盘部分性能数据获取
Windows 磁盘部分性能数据获取 摘要 每次晚上加班总有收获 这次发现了一个fio for windows版本的压测程序, 准备学习和使用一下. https://github.com/axboe/ ...
- [转贴]中国铁塔发布2020年中期财报:营收、利润双增,高效支撑5G规模建设
中国铁塔发布2020年中期财报:营收.利润双增,高效支撑5G规模建设 https://tech.sina.com.cn/roll/2020-08-11/doc-iivhuipn8046256.sh ...
- 京东云开发者|提高IT运维效率,深度解读京东云AIOps落地实践
基于深度学习对运维时序指标进行异常检测,快速发现线上业务问题 时间序列的异常检测是实际应用中的一个关键问题,尤其是在 IT 行业.我们没有采用传统的基于阈值的方法来实现异常检测,而是通过深度学习提出了 ...
- Python 潮流周刊#22:Python 3.12.0 发布了!!
你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中一则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...
- Jekyll安装
本文来自Jekyll官方文档. 简介 Jekyll是一个静态网站生成器,它可以把Markdown写就的文本根据指定的布局生成静态网站.你可以调整网站的外观.URL.页面展示数据等信息. 准备工作 Je ...
- MySQL【一】基本使用----超详细教学
相关文章: win10下MySQL安装教程(MySql-8.0.26超级详细)_丨汀.的博客-CSDN博客 1.RDBMS(Relational Databases Management System ...
- 【七】强化学习之Policy Gradient---PaddlePaddlle【PARL】框架{飞桨}
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- 月薪10K码农,跳槽到40K架构师,技术学习路线图汇总
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.介绍 Hey there! Roadmap to becoming a web devel ...
- UIWindow的概念与使用
UIWindow的作用 UIWindow是UIView的子类用于显示程序内容.每一个UIView想要将内容显示到屏幕上都需要依赖于一个UIWindow. iOS应用程序要想正常运行至少要有一个UIWi ...
- CF1000F One Occurrence题解
题目链接:CF 或者 洛谷 感觉很经典的题,而且给的 \(5e5\),虽然莫队之类的很好想,但完全没必要去考虑这类算法,这种数据范围常数又大又开盲盒.很显然的具有单 \(log\) 的算法. 回忆下经 ...