利用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 相关文章推荐
使用HTML5和CSS3表单验证功能
May 05 HTML / CSS
CSS3 background-image颜色渐变的实现代码
Sep 13 HTML / CSS
CSS3结构性伪类选择器九种写法
Apr 18 HTML / CSS
使用css3制作动感导航条示例
Jan 26 HTML / CSS
CSS3模拟IOS滑动开关效果
Sep 28 HTML / CSS
谈谈对css属性box-sizing的了解
Jan 04 HTML / CSS
使用CSS3实现input多选框自定义样式的方法示例
Jul 19 HTML / CSS
html5 乒乓球(碰撞检测)实例二
Jul 25 HTML / CSS
深入解析HTML5的IndexedDB索引数据库
Sep 14 HTML / CSS
HTML5触摸事件实现移动端简易进度条的实现方法
May 04 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
Aug 29 HTML / CSS
CSS实现fullpage.js全屏滚动效果的示例代码
Mar 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
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
JavaScript面试题大全(推荐)
2016/09/22 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[03:48]大碗DOTA
2019/07/25 DOTA
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
python difflib模块示例讲解
2017/09/13 Python
python3中zip()函数使用详解
2018/06/29 Python
python for和else语句趣谈
2019/07/02 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
2020/01/21 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
管事部库房保管员岗位职责
2014/02/21 职场文书
合作协议书模板2014
2014/09/26 职场文书
学习退步检讨书
2014/09/28 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
社会实践单位意见
2015/06/05 职场文书