咱们都知道触发window.onstorage必须知足如下两个条件:javascript
上面的第二个条件,简单来说就是:要么是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
结合这3个关键属性,咱们就能够实现页面间的数据同步对象
最后提一下localStorage与sessionStorage的区别事件
localStorage 里面存储的数据没有过时时间设置,而存储在 sessionStorage 里面的数据在页面会话结束时会被清除