利用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的新特性介绍
Oct 31 HTML / CSS
谈谈对css属性box-sizing的了解
Jan 04 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
Jan 06 HTML / CSS
html5拍照功能实现代码(htm5上传文件)
Dec 11 HTML / CSS
html5定位获取当前位置并在百度地图上显示
Aug 22 HTML / CSS
实例教程 利用html5和css3打造一款创意404页面
Oct 20 HTML / CSS
详解HTML5 Canvas绘制时指定颜色与透明度的方法
Mar 25 HTML / CSS
html5通过postMessage进行跨域通信的方法
Dec 04 HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
Jan 24 HTML / CSS
使用canvas压缩图片上传的方法示例
Feb 07 HTML / CSS
六种css3实现的边框过渡效果
Apr 22 HTML / CSS
CSS3 Tab动画实例之背景切换动态效果
Aug 23 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
新闻分类录入、显示系统
2006/10/09 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
js中的getAttribute方法使用示例
2014/08/01 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
Vue2.0 ES6语法降级ES5的操作
2020/10/30 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
使用Python的Flask框架来搭建第一个Web应用程序
2016/06/04 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
基于python实现坦克大战游戏
2020/10/27 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
硕士研究生个人求职信
2013/12/04 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
入职担保书怎么写
2014/05/12 职场文书
留学经费担保书
2014/05/12 职场文书
文明礼仪标语
2014/06/13 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
表扬通报怎么写
2015/01/16 职场文书
学校2016年圣诞节活动总结
2016/03/31 职场文书