利用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正方体旋转示例代码
Aug 08 HTML / CSS
使用CSS3制作一个简单的Chrome模拟器
Jul 15 HTML / CSS
非常漂亮的CSS3百叶窗焦点图动画
Feb 24 HTML / CSS
HTML5 FormData 方法介绍以及实现文件上传示例
Sep 12 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
Nov 18 HTML / CSS
HTML页面中添加Canvas标签示例
Jan 01 HTML / CSS
不可轻视HTML5!App三年内将被html5顶替彻底消失
Nov 18 HTML / CSS
详解H5 活动页之移动端 REM 布局适配方法
Dec 07 HTML / CSS
利用Storage Event实现页面间通信的示例代码
Jul 26 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
Oct 22 HTML / CSS
网站性能延迟加载图像的五种技巧(小结)
Aug 13 HTML / CSS
Amaze UI 文件选择域的示例代码
Aug 26 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+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
php实现监听事件
2013/11/06 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
PHP强制转化的形式整理
2020/05/22 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
Angular2 父子组件通信方式的示例
2018/01/29 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
护士个人简历自荐信
2013/10/18 职场文书
大专生简历的自我评价
2013/11/26 职场文书
书香校园建设方案
2014/05/02 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
接待员岗位职责
2015/02/13 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python