前端浏览器本地存储的 三种方法以及实时监听

先抛出问题:当vuex和组件间传值在一定情况下用不了,嘿嘿...这时候监听浏览器本地值 并且实时获取 就变得及其友好,堪比vue的全局事件总线和消息订阅于发布,而且全局可用哦,随意传值,并且只要不是太大(这里的太大指的是浏览器本地存储约sessionStorage5M、localStorage约20M)都可以实现随时取用,而且也可以进行一定的加密不用太担心安全问题。

三种方法分别是:

localStorage和sessionStorage


存储数据:

sessionStorage.setItem(key, value)

获取数据:

sessionStorage.getItem(key)

删除数据:

sessionStorage.removeItem(key)

清空数据:(所有都清除掉)

sessionStorage.clear()

对比项目cookielocalstoragesessionStorage
数据存储时间可设置失效时间永久仅当前会话
容量<=4kb<=5mb<=5mb
相同点
    1、数据存储在用户浏览器中

    2、设置、读取方便、甚至页面刷新不丢失数据

    3、容量较大,sessionStorage约5M、localStorage约20M

    4、只能存储字符串,可以将对象JSON.stringify() 编码后存储

​
不同点
window.sessionStorage
    1、生命周期为关闭浏览器窗口

    2、在同一个窗口(页面)下数据可以共享

    3、以键值对的形式存储使用

window.localStorage
1、声明周期永久生效,除非手动删除 否则关闭页面也会存在

2、可以多窗口(页面)共享(同一浏览器可以共享)

以键值对的形式存储使用

2. cookie

Cookie的使用场景及须知

  1. 用于浏览器和server的通讯

  2. 可设置失效时间,默认是浏览器关闭后失效

  3. 存放数据大小为4K左右

  4. 每次都会携带在HTTP头中,如果使用Cookie保存过多数据会带来性能的问题

  5. .需要程序员自己封装,原生的Cookie接口不友好

  6. cookie的主要属性表格

    keyvalue
    Namecookie的名称
    Valuecookie的值,最大容量4Kb
    Domaincookie存储的域名
    Pathcookie存储的路径
    Sizecookie的大小
    Expires过期时间,值可以是UTC格式,可以使用 Date.prototype.toUTCString() 进行转换
    Max-Age优先级高于Expires,设置cookie存活的秒数
    HttpOnly安全性,设置这个属性后,cookie就不会被js获取到,只有在发起请求时会带上
    Secure不需要设置,当协议是https时,自动开启,指定浏览器只有在加密协议 HTTPS 下才能发送cookie\
    SameSite跨站策略,设置为Lax,即仅允许同站或子站访问cookie;None:允许所有跨站cookie,设置为Lax会导致第三方cookie失效

Cookie用法

(设置) document.cookie= "a=100; b=200"     //一次只能添加一个, 多余的会被截取
​
(读取) document.cookie                   //"a=100" 
​
(修改) document.cookie= "a=101“
     
(读取) document.cookie                   //"a=101"

设置cookie

/**
 * 获取cookie
 * @param {*} key 名称
 */
export const getCookie = (key) => {
 
  var getCookie = document.cookie.replace(/[ ]/g, "");
 
  var arrCookie = getCookie.split(";")
 
  var tips;
 
  for (var i = 0; i < arrCookie.length; i++) {
 
    var arr = arrCookie[i].split("=");
 
    if (key == arr[0]) {
 
      tips = arr[1];
 
      break;
 
    }
 
  }
 
  return tips;
 
}

获取cookie

/**
 * 获取cookie
 * @param {*} key 名称
 */
export const getCookie = (key) => {
 
  var getCookie = document.cookie.replace(/[ ]/g, "");
 
  var arrCookie = getCookie.split(";")
 
  var tips;
 
  for (var i = 0; i < arrCookie.length; i++) {
 
    var arr = arrCookie[i].split("=");
 
    if (key == arr[0]) {
 
      tips = arr[1];
 
      break;
 
    }
 
  }
 
  return tips;
 
}
 

删除cookie

可以直接调用setCookie,把cookie的失效时间设置为-1即可

setCookie(key,'',-1)

3.localStorage和sessionStorage实时监听

1、使用场景
(1)在vue项目中,为了在浏览器刷新时,页面数据不丢失,我们会选择将数据浏览器缓存sessionStorage中。
(2)为了传递参数
之所以写这篇文章,也是在上次处理vue中使用keep- alive缓存机制,切换标签含有iframe标签的界面会被重新刷新的问题
过程中,由于切换标签,含iframe的组件不会在触发路由钩子函数和生命周期函数,导致界面数据无法做更新操作,同时还要解决浏览器刷新时,界面数据不丢失的问题,所以才考虑到去监听sessionStorage的值,以此来更新数据。

2、具体实现思路

(1)在vue项目main.js文件中,在vue原型上定义resetSetItem,代码如下:

Vue.prototype.resetSetItem = function (key, newVal) {
  if (key === 'printReportShowQuery') {
    // 创建一个StorageEvent事件
    var newStorageEvent = document.createEvent('StorageEvent');
    const storage = {
      setItem: function (k, val) {
        sessionStorage.setItem(k, val);
        // 初始化创建的事件
        newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null);
        // 派发对象
        window.dispatchEvent(newStorageEvent)
      }
    }
    return storage.setItem(key, newVal);
  }
}

2)通过resetSetItem方法存值,代码如下:

 self.resetSetItem('printReportShowQuery', JSON.stringify(query));

(3)getItem取值和window.addEventListener监听,代码如下:

created() {
      let routQuery = {};
      let self = this;
      window.addEventListener('setItem', ()=> {
        let printReportShowQuery = JSON.parse(sessionStorage.getItem('printReportShowQuery'));
        routQuery.url = printReportShowQuery.url;
        routQuery.params = JSON.parse(printReportShowQuery.params);
        self.init(routQuery);
      });
    },

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1、 JavaScript 的基本类型有哪些?引用类型有哪些?null 和 undefined 的区别?(必 会) 76 2、如何判断 JavaScript 的数据类型?(必会) JavaScript 数据类型一共有 7 种: 77 2、 创建对象有几种方法(必会) 79 4、简述创建函数的几种方式? (必会) 79 5、Javascript 创建对象的几种方式? (必会) 79 6、请指出 JavaScript 宿主对象和原生对象的区别?(必会) 81 7、 JavaScript 内置的常用对象有哪些?并列举该对象常用的方法?(必会) 82 8、 === 和 ==的区别?(必会) 87 9、 null,undefined 的区别(必会) 88 10、JavaScript 中什么情况下会返回 undefined 值?(必会) 88 11、如何区分数组和对象?(必会) 89 12、怎么判断两个对象相等?(必会) 89 13、列举三种强制类型转换和两种隐式类型转换?(必会) 91 14、 JavaScript 中怎么获取当前日期的月份?(必会) 91 15、 什么是类数组(伪数组),如何将其转化为真实的数组?(必会) 92 16、如何遍历对象的属性?(必会) 92 17、src 和 href 的区别是?(必会) 94 18、如何使用原生 JavaScript 给一个按钮绑定两个 onclick 事件?(必会) 95 19、 如何在 JavaScript 中比较两个对象?(必会) 95 20、JavaScript 中的作用域、预解析与变量声明提升? (必会) 97 21、变量提升与函数提升的区别?(必会) 99 22、 什么是作用域链?(必会) 99 23、如何延长作用域链?(必会) 99 23、 判断一个值是什么类型有哪些方法?(必会) 100 25、JavaScript 变量按照存储方式区分为哪些类型,并描述其特点?(必会) 100 26、如何实现数组的随机排序?(必会) 100 27、 Function foo() {}和 var foo = function() {}之间 foo 的用法上的区别?(必会) 101 28、索引有哪几种类型,有什么区别?(了解) 102 29、简述 Array.form 和 Array.of 的使用及区别?(了解) 103 30、根据你的理解,请简述 JavaScript 脚本的执行原理(了解) 104 WebAPI 105 1、 什么是 dom?(必会) 105 2、dom 是哪种基本的数据结构?(必会) 105 3、 dom 操作的常用 api 有哪些?(必会) 105 4、 dom 节点的 Attribute 和 Property 有何区别?(必会) 106 5、dom 结构操作怎样添加、移除、移动、复制、创建和查找节点?(必会) 106 6、dom 事件的级别?(必会) 107 7、dom 事件模型?(必会) 107 8、dom 事件流?(必会) 107 9、什么是事件冒泡,它是如何工作的?如何阻止事件冒泡?(必会) 108 10、JavaScript 动画和 CSS3 动画有什么区别?(必会) 108 11、event 对象的常见应用?(必会) 109 12、自定义事件/ 模拟事件?(必会) 109 13、通用事件绑定/ 编写一个通用的事件监听函数?(必会) 110 14、dom 和 bom 的区别(必会) 111 15、事件三要素(必会) 111 16、事件执行过程(必会) 111 17、获取元素位置(必会) 112 18、封装运动函数(必会) 112 19、绑定事件和解除事件的区别(必会) 113 20、谈谈事件委托的理解?(必会) 114 21、 JavaScript 中的定时器有哪些?他们的区别及用法是什么?(必会) 114 22、比较 attachEvent 和 addEventListener?(必会) 115 23、document.write 和 innerHTML 的区别?(必会) 115 24、 什么是 window 对象?什么是 document 对象?(必会) 116 25、Js 拖动的原理?(必会) 118 26、描述浏览器的渲染过程,DOM 树和渲染树的区别(必会) 119 27、dom 树和 render 树之间的关系?(高薪常问) 119 28、获取到页面中所有的 CheckBox 怎么做(不适用第三方框架)?(高薪常问) 119 29、 简单说一下页面重绘和回流?(高薪常问) 119 30、如何最小化重绘(repaint)和回流(reflow)(高薪常问) 120 31、Js 延迟加载的方式有哪些?(了解) 120 32、IE 与
前端html5框架ZUI发布1.2正式版本了! 此版本增加了很多新特性,同时修复问题,文档也得到大幅完善。 欢迎大家使用并反馈问题, 更新明细: 1、新增日历视图组件,方便实现日程的展示 2、新增数据表格视图组件,更轻松实现复杂数据的展示,移除table.data.js 3、重新实现的模态框触发器,模态框触发器同时支持加载远程内容和实时内容,实时根据自身内容调整位置和尺寸,重新设计了调用接口,使用更加方便,消除了模态框触发器于一般模态框发生冲突的隐患 4、package.json增加组件及其依赖关系的配置,重新实现了Grunt任务,编译单独组件更加方便,并支持任意组件集合的打包编译,grunt任务将自动管理组件之间的依赖关系 5、大幅更新文档部分章节内容,并对文档整理样式进行了调整,在文档中可以查看每个组件属性,并给出第三方组件版本及用户支持信息,文档支持IE8,优化文档在小屏幕上的表现 6、重新实现了漂浮消息组件,调用更方便,更好的动画效果 7、新增新的第三方组件chartjs,能够绘制简单图表 8、增加browser.js,为IE系列的浏览器增加版本提示辅助类 9、新增 'store.js',实现本地存储通用接口,并增加单独页面范围的独立存储机制,beta版本中的页面标识有时不正确的bug已得到修复 10、新增 'jquery.extensions.js',增加一些实用的jQuery扩展方法,便于进行其他组件的开发,移除原'unities.js' 11、增加array.js,提供一些操作数组的实用方法 12、调整了dist目录结构,第三方组件和适合单独调用的组件将直接包含在lib目录中 13、Chosen选项及分组支持title属性,Chosen弹出列表支持自定义宽度,调整多选Chosen中选项的样式 14、修复Chosen中特定情况下placeholder无法显示的问题 15、日期时间选择器将能够自动从html标签中获取页面语言设置并应用语言设置 16、调整左侧固定导航样式 17、在date.js中增加一些实用方法来帮助进行日期计算 18、模态框支持额外的两种默认尺寸,修复某些时候模态框弹出时滚动条闪动的问题 19、修复代码段第一行出现错位的样式问题 20、一些组件的额外组成部分其对应的文件被重新命名 21、修复特定情况下kindeditor图标无法显示的问题 22、优化区块面板视图动作按钮事件监听机制 23、修复color.js中增加命名颜色支持 26、弹出框增加新的选项能够制定JS生成DOM的id属性,便于自定义样式 27、大幅优化代码,修复一些在Javascript代码中的错误,完善关键代码注释,增强部分代码文件与requierejs的兼容性
前端页面上,我们可以使用`localStorage`对象来进行浏览器本地存储的操作。以下是一个示例代码,演示如何将用户搜索的关键词保存到浏览器本地存储中: ```javascript // 获取搜索框和搜索按钮元素 const searchInput = document.getElementById('searchInput'); const searchButton = document.getElementById('searchButton'); // 监听搜索按钮的点击事件 searchButton.addEventListener('click', () => { // 获取用户输入的搜索关键词 const keyword = searchInput.value.trim(); // 如果搜索关键词为空,则不进行保存操作 if (!keyword) { return; } // 将搜索关键词保存到浏览器本地存储中 const historyList = JSON.parse(localStorage.getItem('searchHistory') || '[]'); historyList.unshift(keyword); localStorage.setItem('searchHistory', JSON.stringify(historyList)); }); ``` 在上述代码中,我们首先获取了搜索框和搜索按钮的元素,并通过`addEventListener`方法监听了搜索按钮的点击事件。当用户点击搜索按钮时,我们获取了用户输入的搜索关键词,并进行了一些简单的处理(如去除空格等)。接着,我们通过`localStorage`对象获取了之前保存的搜索历史记录列表,将当前搜索关键词添加到列表的最前面,并将更新后的列表重新保存到本地存储中。需要注意的是,在将列表保存到本地存储中时,我们使用了`JSON.stringify`方法将其转换为字符串格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值