当前位置:首页 > 科技  > 软件

使用原生cookieStore方法,让Cookie操作更简单

来源: 责编: 时间:2024-02-29 14:42:53 112观看
导读前言对于前端来讲,我们在操作cookie时往往都是基于document.cookie,但它有一个缺点就是操作复杂,它并没有像localStorage那样提供一些get或set等方法供我们使用。对与cookie的操作一切都是基于字符串来进行的。为了让coo

前言

对于前端来讲,我们在操作cookie时往往都是基于document.cookie,但它有一个缺点就是操作复杂,它并没有像localStorage那样提供一些get或set等方法供我们使用。对与cookie的操作一切都是基于字符串来进行的。为了让cookie的操作更简便, Chrome87率先引入了cookieStore方法。L3R28资讯网——每日最新资讯28at.com

document.cookie

document.cookie可以获取并设置当前文档关联的cookieL3R28资讯网——每日最新资讯28at.com

获取cookie

const cookie = document.cookie

在上面的代码中,cookie 被赋值为一个字符串,该字符串包含所有的 Cookie,每条 cookie 以"分号和空格 (; )"分隔 (即, key=value 键值对)。L3R28资讯网——每日最新资讯28at.com

图片图片L3R28资讯网——每日最新资讯28at.com

但这拿到的是一整个字符串,如果你想获取cookie中的某一个字段,还需要自己处理L3R28资讯网——每日最新资讯28at.com

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值的L3R28资讯网——每日最新资讯28at.com

设置cookie

document.cookie = `name=前端南玖;`

它的值是一个键值对形式的字符串。需要注意的是,用这个方法一次只能对一个 cookie 进行设置或更新。L3R28资讯网——每日最新资讯28at.com

比如:L3R28资讯网——每日最新资讯28at.com

document.cookie = `age=18; city=shanghai;`

这样只有age能够设置成功L3R28资讯网——每日最新资讯28at.com

  • 以下可选的 cookie 属性值可以跟在键值对后,用来具体化对 cookie 的设定/更新,使用分号以作分隔:

这个值的格式参见Date.toUTCString() (en-US)L3R28资讯网——每日最新资讯28at.com

;path=path (例如 '/', '/mydir') 如果没有定义,默认为当前文档位置的路径。L3R28资讯网——每日最新资讯28at.com

;domain=domain (例如 'example.com', 'subdomain.example.com') 如果没有定义,默认为当前文档位置的路径的域名部分。与早期规范相反的是,在域名前面加 . 符将会被忽视,因为浏览器也许会拒绝设置这样的 cookie。如果指定了一个域,那么子域也包含在内。L3R28资讯网——每日最新资讯28at.com

;max-age=max-age-in-seconds (例如一年为 606024*365)L3R28资讯网——每日最新资讯28at.com

;expires=date-in-GMTString-format

如果没有定义,cookie 会在对话结束时过期L3R28资讯网——每日最新资讯28at.com

;secure (cookie 只通过 https 协议传输)L3R28资讯网——每日最新资讯28at.com

  • 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方法的封装L3R28资讯网——每日最新资讯28at.com

删除cookie

function removeCookie (key, attributes) {  setCookie(    key,    '',    assign({}, attributes, {      expires: -1    })  );}removeCookie('course')

新方法cookieStore

以上就是通过document.cookie来操作cookie的方法,未封装方法之前操作起来都非常的不方便。现在我们再来了解一下新方法cookieStore,它是一个类似localStorage的全局对象。L3R28资讯网——每日最新资讯28at.com

图片图片L3R28资讯网——每日最新资讯28at.com

它提供了一些方法可以让我们更加方便的操作cookieL3R28资讯网——每日最新资讯28at.com

获取单个cookie

cookieStore.get(name)

该方法可以获取对应key的单个cookie,并且以promise形式返回对应的值L3R28资讯网——每日最新资讯28at.com

async function getCookie (key) {  const name = await cookieStore.get(key)  console.log('【name】', name)}getCookie('name')

图片图片L3R28资讯网——每日最新资讯28at.com

当获取的cookie不存在时,则会返回nullL3R28资讯网——每日最新资讯28at.com

获取所有cookie

cookieStore.getAll()

该方法可以获取所有匹配的cookie,并且以promise形式返回一个列表L3R28资讯网——每日最新资讯28at.com

async function getAllCookies () {  const cookies = await cookieStore.getAll()  console.log('【cookies】', cookies)}getAllCookies()

L3R28资讯网——每日最新资讯28at.com

当cookie不存在时,则会返回一个空数组L3R28资讯网——每日最新资讯28at.com

设置cookie

cookieStore.set()

该方法可以设置cookie,并且会返回一个promise状态,表示是否设置成功L3R28资讯网——每日最新资讯28at.com

function setCookie (key, value) {  cookieStore.set(key, value).then(res => {    console.log('设置成功')  }).catch(err => {    console.log('设置失败')  })}setCookie('site', 'https://bettersong.github.io/nanjiu/')

如果想要设置更多的属性,比如:过期时间、路径、域名等,可以传入一个对象L3R28资讯网——每日最新资讯28at.com

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/')

L3R28资讯网——每日最新资讯28at.com

删除cookie

cookieStore.delete(name)

该方法可以用来删除指定的cookie,同样会返回一个promise状态,来表示是否删除成功L3R28资讯网——每日最新资讯28at.com

function removeCookie (key) {  cookieStore.delete(key).then(res => {    console.log('删除成功')  }).catch(err => {    console.log('删除失败')  })}removeCookie('site')

L3R28资讯网——每日最新资讯28at.com

需要注意的是:即使删除一个不存在的cookie也会返回删除成功状态L3R28资讯网——每日最新资讯28at.com

监听cookie

cookieStore.addEventListener('change', (event) => {  console.log(event)});

L3R28资讯网——每日最新资讯28at.com

可以通过change事件来监听cookie的变化,无论是通过cookieStore操作的,还是通过document.cookie来操作的都能够监听到。L3R28资讯网——每日最新资讯28at.com

该方法的返回值有两个字段比较重要,分别是:change盒delete,它们都是数组类型。用来存放改变和删除的cookie信息L3R28资讯网——每日最新资讯28at.com

监听修改

调用set方法时,会触发change事件,修改或设置的cookie会存放在change数组中L3R28资讯网——每日最新资讯28at.com

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/')

L3R28资讯网——每日最新资讯28at.com

⚠️需要注意的是:L3R28资讯网——每日最新资讯28at.com

  • 通过document.cookie设置或删除cookie时,都是会触发change事件,不会触发delete事件
  • 即使两次设置cookie的name和value都相同,也会触发change事件

监听删除

调用delete方法时,会触发change事件,删除的cookie会存放在delete数组中L3R28资讯网——每日最新资讯28at.com

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')

L3R28资讯网——每日最新资讯28at.com

⚠️需要注意的是:L3R28资讯网——每日最新资讯28at.com

  • 如果删除一个不存在的cookie,则不会触发change事件

兼容性

在使用该方法时需要注意浏览器的兼容性L3R28资讯网——每日最新资讯28at.com

L3R28资讯网——每日最新资讯28at.com

总结

cookieStore提供的方法比起直接操作document.cookie要简便许多,不仅支持增删改查,还支持通过change事件来监听cookie的变化,但是在使用过程需要注意兼容性问题。L3R28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-75335-0.html使用原生cookieStore方法,让Cookie操作更简单

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 33张图探秘OpenFeign核心架构原理

下一篇: React 跨平台开发指日可待!

标签:
  • 热门焦点
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 2023 年的 Node.js 生态系统

    2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • JavaScript学习 -AES加密算法

    JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 在线图片编辑器,支持PSD解析、AI抠图等

    在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。&ldquo;提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
Top
Baidu
map