利用Storage Event实现页面间通讯

咱们都知道触发window.onstorage必须知足如下两个条件:javascript

  1. 经过localStorage.setItem或sessionStorage.setItem保存(更新)某个storage
  2. 保存(更新)这个storage时,它的新值必须与以前的值不一样

上面的第二个条件,简单来说就是:要么是storage的初始化,由于不存在的storage,其值为null;要么就是对已有storage的更新html

举例:java

// 初始化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事件回调都会被执行session

举例:函数

// 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事件都会被触发code

如今咱们已经知道如何利用storage event实现了页面之间的通讯,那么这个通讯对于咱们有何用途呢?
其实咱们只需知道是哪一个storage的更新操做触发了onstorage事件就足够了,那么咱们如何知道呢?onstorage事件回调和其余事件回调函数同样,也接收一个event对象参数,在这个对象中有3个有用的属性,它们分别是:htm

  1. key 被初始化或更新的storage的键名
  2. oldValue 被初始化或更新的storage以前的值
  3. newValue 被初始化或更新的storage以后的值

结合这3个关键属性,咱们就能够实现页面间的数据同步对象

最后提一下localStorage与sessionStorage的区别事件

localStorage 里面存储的数据没有过时时间设置,而存储在 sessionStorage 里面的数据在页面会话结束时会被清除
相关文章
相关标签/搜索