利用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实现简易版的刮刮乐效果
Sep 27 HTML / CSS
CSS3制作精致的照片墙特效
Jun 07 HTML / CSS
CSS3制作翻转效果_动力节点Java学院整理
Jul 11 HTML / CSS
CSS3教程(5):网页背景图片
Apr 02 HTML / CSS
CSS3盒子模型详解
Apr 24 HTML / CSS
一款纯css3实现的非常实用的鼠标悬停特效演示
Nov 05 HTML / CSS
CSS Grid布局教程之什么是网格布局
Dec 30 HTML / CSS
通过css3的filter滤镜改变png图片的颜色的示例代码
May 06 HTML / CSS
详解canvas在圆弧周围绘制文本的两种写法
May 22 HTML / CSS
HTML5 Canvas 破碎重组的视频特效的示例代码
Sep 24 HTML / CSS
HTML5 Canvas概述
Aug 26 HTML / CSS
推荐WEB开发者最佳HTML5和CSS3代码生成器
Nov 24 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
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
JavaScript 程序编码规范
2010/11/23 Javascript
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
node后端服务保活的实现
2019/11/10 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
Python执行时间的计算方法小结
2017/03/17 Python
浅谈Django的缓存机制
2018/08/23 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
Python控制Firefox方法总结
2019/06/03 Python
Python坐标线性插值应用实现
2019/11/13 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
企业整改报告范文
2014/11/08 职场文书
申报材料格式
2014/12/30 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
初中运动会前导词
2015/07/20 职场文书
2016年端午节校园广播稿
2015/12/18 职场文书
php字符串倒叙
2021/04/01 PHP