前言

对于前端来讲,我们在操作cookie时往往都是基于document.cookie,但它有一个缺点就是操作复杂,它并没有像localStorage那样提供一些getset等方法供我们使用。对与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 会在对话结束时过期

    • ;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来操作的都能够监听到。

该方法的返回值有两个字段比较重要,分别是:changedelete,它们都是数组类型。用来存放改变和删除的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的namevalue都相同,也会触发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 操作更简单的更多相关文章

  1. 分享几个日常调试方法让js调试更简单

    下面分享几个日常调试代码的时候在Console命令行显示你的操作,让你的js调试更简单. console显示信息的命令 在浏览器按f12在console上显示你的文本. <!DOCTYPE ht ...

  2. 基于jQuery的Cookie操作插件--简单而又没有兼容性问题!

    在网页客户端,我们经常会遇到读取或者设置cookie的情况,如果用纯生的js我们可能会遇到一些兼容性带来的麻烦,这里给大家介绍一个比较实用jquery操作cookie的插件,插件的源代码如下: 1 2 ...

  3. .net 多播委托的使用方法以及场景,更简单的观察者模式

    首先来说一下什么是多播委托 多播委托就是在委托里定义一个或者多个方法的一个集合 使用方法: public Action actList; //添加方法 public void AddActionMet ...

  4. Vue之cookie操作(原生)

    Vue之cookie操作(原生) 再vue组件中加入以下几个方法,然后调用即可. methods:{ //读取cookie,需要注意的是cookie是不能存中文的,如果需要存中文,解决方法是后端先进行 ...

  5. 原生JavaScript常用本地浏览器存储方法二(cookie)

    JavsScript Cookie概述 cookie是浏览器提供的一种机制,它将document对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是Jav ...

  6. js 判断js函数、变量是否存在 JS保存和删除cookie操作,判断cookie是否存在的方法

    //是否存在指定函数 function isExitsFunction(funcName) {    try {        if (typeof(eval(funcName)) == " ...

  7. js实用方法记录-简单cookie操作

    js实用方法记录-简单cookie操作 设置cookie:setCookie(名称,值,保存时间,保存域); 获取cookie:setCookie(名称); 移除cookie:setCookie(名称 ...

  8. cookie操作大全

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  9. 学习笔记: JavaScript/JQuery 的cookie操作

    转自:http://blog.csdn.net/barryhappy/archive/2011/04/27/6367994.aspx cookie是网页存储到用户硬盘上的一小段信息.最常见的作用是判断 ...

  10. 【WebView】Android WebView中的Cookie操作

    Hybrid App(混合式应用)的开发过程中少不了与WebView的交互,在涉及到账户体系的产品中,包含了一种登录状态的传递.比如,在Native(原生)界面的登录操作,进入到Web界面时,涉及到账 ...

随机推荐

  1. 【转帖】Docker容器四种网络模式

    https://blog.whsir.com/post-5268.html docker自身默认提供了四种网络模式:none.bridge.container.host.除了这四种网络模式外,还可以通 ...

  2. [转帖]013 Linux 搞懂「文件所属者更改及权限的赋予」从未如此简单 (chmod、chgrp、chown)

    https://my.oschina.net/u/3113381/blog/5435014   01 一图详解「ls -l」 02 两种符号区分表示文件和目录 -(横线) # 表示非目录文件 d # ...

  3. [转帖] Linux命令拾遗-文本处理篇

    https://www.cnblogs.com/codelogs/p/16060413.html 简介# 这是Linux命令拾遗系列的第二篇,本篇主要介绍Linux中与文本处理相关的命令,如xargs ...

  4. 不同信创服务器Redis7.0.5性能表现总结

    不同信创服务器Redis7.0.5性能表现总结 背景以及基础约定 随着美帝2022.10收紧EAR规定的硬件出口规定 信创事业迎来了一波新的高潮. 最近不仅仅要求国产化的硬件. 更要求国产化的OS,以 ...

  5. Linux 开启防火墙 避免非干系人误操作的处理

    公司里面进行系统集成测试. 不想让开发能够更改我的服务器信息, 但是改密码又太麻烦了. 想了想还是用 防火墙好一些. 第一步 开启防火墙 systemctl enable firewalld syst ...

  6. iperf的学习与部分网络状况的简要总结

    背景 随着信息安全的越来越重要,公司要求进行数据备份. 部分客户现场交付之前需要进行性能压测,但是因为各种环境问题效果不是很理想. 前段时间疫情严重,经常需要居家办公,出现了很多网络相关的问题. 因为 ...

  7. antv-x6 使用及总结

    1 简介 AntV是一个数据可视化(https://so.csdn.net/so/search?q=数据可视化&spm=1001.2101.3001.7020 )的工具(https://ant ...

  8. web字体小于12px的解决办法

    大家都知道,web端的字体在正常情况下,最小只能够是12px; 但是有些时候,可能需要字体小于12px 那么如何解决这个办法了 可以使用css3的缩放属性scale 如果字体的大小是10px; 那么我 ...

  9. Vue基础系列文章10---单文件组件

    1.单文件组件的结构 <template> <!--这里用于定义VUE组件的模块内容--> <dvi> <h1>这是 APP 根组件</h1> ...

  10. 消息队列RabbitMQ教程

    RabbitMQ教程 翻译自RabbitMQ Tutorials. 0. 准备 前期准备 1. Hello World 最简入门教程 2. 工作队列 竞争消费者模式 3. 发布/订阅 同时发送消息给多 ...