利用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 相关文章推荐
纯CSS实现预加载动画效果
Sep 06 HTML / CSS
css3实现超炫风车特效
Nov 12 HTML / CSS
css3进阶之less实现星空动画的示例代码
Sep 10 HTML / CSS
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
Apr 22 HTML / CSS
HTML5使用DOM进行自定义控制示例代码
Jun 08 HTML / CSS
用HTML5制作一个简单的桌球游戏的教程
May 12 HTML / CSS
浅谈html5增强的页面元素
Jun 14 HTML / CSS
html5实现滑块功能之type=&quot;range&quot;属性
Feb 18 HTML / CSS
AmazeUI 输入框组的示例代码
Aug 14 HTML / CSS
AmazeUI图片轮播效果的示例代码
Aug 20 HTML / CSS
html form表单基础入门案例讲解
Jul 15 HTML / CSS
使用HBuilder制作一个简单的HTML5网页
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
php 8小时时间差的解决方法小结
2009/12/22 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
如何在PHP中使用数组
2020/06/09 PHP
让div层随鼠标移动的实现代码 ie ff
2009/12/18 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
javascript中sort() 方法使用详解
2015/08/30 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
简单说明Python中的装饰器的用法
2015/04/24 Python
剖析Python的Tornado框架中session支持的实现代码
2015/08/21 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
python3调用windows dos命令的例子
2019/08/14 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
总裁岗位职责
2013/12/04 职场文书
授权委托书范本
2014/04/03 职场文书
环保口号大全
2014/06/12 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
经典祝酒词大全
2015/08/12 职场文书
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫