利用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的loading动画加载相关的transition优化
May 18 HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
Apr 05 HTML / CSS
CSS3圆角边框和边界图片效果实例
Jul 01 HTML / CSS
css3 实现圆形旋转倒计时
Feb 24 HTML / CSS
CSS3 创建网页动画实现弹跳球动效果
Oct 30 HTML / CSS
CSS3 旋转立方体问题详解
Jan 09 HTML / CSS
CSS3中新增的对文本和字体的设置
Feb 03 HTML / CSS
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
Dec 22 HTML / CSS
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
Jan 03 HTML / CSS
浅谈html5 响应式布局
Dec 24 HTML / CSS
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
Apr 22 HTML / CSS
CSS实现背景图片全屏铺满自适应的3种方式
Jul 07 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
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
js function定义函数使用心得
2010/04/15 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
jQuery查找dom的几种方法效率详解
2017/05/17 jQuery
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
python检测lvs real server状态
2014/01/22 Python
Python制作简单的网页爬虫
2015/11/22 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
Win10下python3.5和python2.7环境变量配置教程
2018/09/18 Python
python遍历文件目录、批量处理同类文件
2019/08/31 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
Django3中的自定义用户模型实例详解
2020/08/23 Python
pandas实现导出数据的四种方式
2020/12/13 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
JSP&Servlet技术面试题
2015/05/21 面试题
违反学校规定检讨书
2014/01/18 职场文书
校长寄语大全
2014/04/09 职场文书
开工仪式策划方案
2014/05/23 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
班子个人四风问题整改措施
2014/10/04 职场文书
检讨书范文500字
2015/01/28 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers