利用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 相关文章推荐
Web页面中八种创建多列等高(等高列布局)的实现技术
Dec 24 HTML / CSS
CSS3 text shadow字体阴影效果
Jan 08 HTML / CSS
CSS3实现3D翻书效果
Jun 20 HTML / CSS
CSS3实现时间轴效果
Jul 11 HTML / CSS
简单几步用纯CSS3实现3D翻转效果
Jan 17 HTML / CSS
css3通过scale()、rotate()实现放大、旋转
Mar 19 HTML / CSS
html5 利用canvas实现超级玛丽简单动画
Sep 06 HTML / CSS
HTML5和CSS3实例教程总结(推荐)
Jul 18 HTML / CSS
html5将图片转换成base64的实例代码
Sep 21 HTML / CSS
canvas 实现 github404动态效果的示例代码
Nov 15 HTML / CSS
AmazeUI 按钮交互的实现示例
Aug 24 HTML / CSS
background-position百分比原理详解
May 08 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页面缓存方法小结
2015/01/10 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
python实现通过shelve修改对象实例
2014/09/26 Python
python实现自动更换ip的方法
2015/05/05 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
python IP地址转整数
2020/11/20 Python
露营世界:Camping World
2017/02/02 全球购物
几个常见的消息中间件(MOM)
2014/01/08 面试题
社区工作者思想汇报
2014/01/13 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
辞职信如何写
2015/02/27 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书