利用Storage Event实现页面间通信的示例代码


Posted in HTML / CSS onJuly 26, 2018

我们都知道触发window.onstorage必须满足以下两个条件:

  • 通过localStorage.setItem或sessionStorage.setItem保存(更新)某个storage
  • 保存(更新)这个storage时,它的新值必须与之前的值不同

上面的第二个条件,简单来讲就是:要么是storage的初始化,因为不存在的storage,其值为null;要么就是对已有storage的更新

举例:

// 初始化storage
window.localStorage.setItem('a', 123);

// 注册onstorage事件
window.onstorage = (e) => {
  console.log(e);
};

// 更新storage
window.localStorage.setItem('a', 123);

上面的最后一行代码并不会触发onstorage事件,因为a的值并没有变化,前后都是123,所以浏览器判定这次更新是无效的

由于onstorage事件是浏览器触发的,所以如果我们打开了多个相同域名下的页面,并在其中任一一个页面执行window.localStorage.setItem方法(还要保证满足文章开头提到的第二个条件),那么其他页面如果监听了onstorage事件,则这些页面中的onstorage事件回调都会被执行

举例:

// http://www.example.com/a.html
<script>
// 注册onstorage事件
window.onstorage = (e) => {
  console.log(e);
};
</script>
// http://www.example.com/b.html
<script>
// 注册onstorage事件
window.onstorage = (e) => {
  console.log(e);
};
</script>
// http://www.example.com/c.html
<script>
// 触发onstorage事件
window.localStorage.setItem('a', new Date().getTime());
</script>

只要保证c页面在a和b页面之后打开(哪怕三个页面不在同一浏览器窗口,这里需要区别窗口与tab页的区别),那么a和b页面中的onstorage事件都会被触发

现在我们已经知道如何利用storage event实现了页面之间的通信,那么这个通信对于我们有何用途呢?

其实我们只需知道是哪个storage的更新操作触发了onstorage事件就足够了,那么我们如何知道呢?onstorage事件回调和其他事件回调函数一样,也接收一个event对象参数,在这个对象中有3个有用的属性,它们分别是:

  • key 被初始化或更新的storage的键名
  • oldValue 被初始化或更新的storage之前的值
  • newValue 被初始化或更新的storage之后的值

结合这3个关键属性,我们就可以实现页面间的数据同步

最后提一下localStorage与sessionStorage的区别

localStorage 里面存储的数据没有过期时间设置,而存储在 sessionStorage 里面的数据在页面会话结束时会被清除

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3 box-sizing属性
Apr 17 HTML / CSS
CSS3中HSL和HSLA的简单使用示例
Jul 14 HTML / CSS
CSS3 3D旋转rotate效果实例介绍
May 03 HTML / CSS
Html5移动端弹幕动画实现示例代码
Aug 27 HTML / CSS
在html5的Canvas上绘制椭圆的几种方法总结
Jan 07 HTML / CSS
HTML中fieldset标签概述及使用方法
Feb 01 HTML / CSS
探索HTML5本地存储功能运用技巧
Mar 02 HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
Jul 24 HTML / CSS
基于Html5实现的语音搜索功能
May 13 HTML / CSS
AmazeUI 评论列表的实现示例
Aug 13 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
Jan 22 HTML / CSS
CSS 实现Chrome标签栏的技巧
Aug 04 HTML / CSS
详解移动端Html5页面中1px边框的几种解决方法
Jul 24 #HTML / CSS
htnl5利用svg页面高斯模糊的方法
Jul 20 #HTML / CSS
html5 input输入实时检测以及延时优化
Jul 18 #HTML / CSS
利用canvas实现图片压缩的示例代码
Jul 17 #HTML / CSS
canvas 如何绘制线段的实现方法
Jul 12 #HTML / CSS
前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)
Jul 12 #HTML / CSS
如何用canvas实现在线签名的示例代码
Jul 10 #HTML / CSS
You might like
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
jQuery实现的右下角广告窗体跟随效果示例
2016/09/16 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
python根据出生日期获得年龄的方法
2015/03/31 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
python的re模块使用方法详解
2019/07/26 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
python实现3D地图可视化
2020/03/25 Python
用python写爬虫简单吗
2020/07/28 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
学生自我鉴定模板
2013/12/30 职场文书
中学家长会邀请函
2014/02/03 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
公务员年度考核登记表个人总结
2015/02/12 职场文书
公司门卫岗位职责
2015/04/13 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
大学毕业典礼致辞
2015/07/29 职场文书
《山中访友》教学反思
2016/02/24 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
cypress测试本地web应用
2022/06/01 Javascript