引用《h5移动web开发指南》上的话:

“当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发”

所以,localStorage  storage的例子运行需要如下条件:

同一浏览器打开了两个同源页面

其中一个网页修改了localStorage

另一网页注册了storage事件

Storage事件

在某些复杂情况下,如果多个页面都需要访问本地存储的数据,就需要在存储区域的内容发生改变时,能够通知相关的页面。

Web Storage API内建了一套事件通知机制,当存储区域的内容发生改变(包括增加、修改、删除数据)时,就会自动触发 storage 事件,并把它发送给所有感兴趣的监听者。因此,如果需要跟踪存储区域的改变,就需要在关心存储区域内容的页面监听 storage 事件。

所有支持 localStorage 的浏览器都支持 storage 事件,包括 IE8。但IE 8不支持 W3C 标准的 addEventListener。因此,为了监听 storage 事件,还需要检测浏览器支持哪种事件机制:

if (window.addEventListener) {

window.addEventListener("storage", handleStorage, false);

} else {

window.attachEvent("onstorage", handleStorage);

}

handleStorage 回调函数接受一个 StorageEvent 参数,在IE中,StorageEvent对象保存在 window.event 里面。

function handleStorage(e) {

if (!e) {

e = window.event;

}

}

此时,变量 e 就是一个 StorageEvent 对象,这个对象有很多有用的属性。这些属性及含义见表:

表 StorageEvent对象的属性及含义

属性       含义

key 设置或删除或修改的键。调用clear()时,则为null。

oldValue      改变之前的旧值。如果是新增元素,则为null。

newValue     改变之后的新值。如果是删除元素,则为null。

storageArea 该属性是一个引用,指向发生变化的sessionStorage或localStorage对象

url   触发这个改变事件的页面的URL

得到这些属性之后,就可以做任何想做的事情。接下来,通过一个完整的实例,来演示一下 localStorage 的 storage 事件机制。

假设有 save.html 和 show.html 两个页面,在 save 页面触发数据改变,在 show 页面通过弹窗将相关信息显示出来。

在 save 页面中,有一个文本框和一个保存按钮,用户在文本框中输入数据后,点击保存按钮,就会调用 saveItem() 函数将用户的输入保存到本地存储中。代码如下:

<input type="text" id="data" placeholder="input date to save">

<button onClick="saveItem()">保存</button>

<script>

function saveItem() {

var data = document.getElementById("data").value;

localStorage.setItem("data", data);

}

</script>

在 show 页面中,注册事件监听函数,来监听 storage 事件,因为它关心存储区域内容的变化:

<script>

if (window.addEventListener) {

window.addEventListener("storage", showStorage);

} else {

window.attachEvent("onstorage", showStorage);

}

function showStorage(e) {

if (!e) {

e = window.event;

}

var str = "key: " + e.key +

"\nnewValue: " + e.newValue +

"\noldValue: " + e.oldValue +

"\nurl: " + e.url +

"\nstorageArea: " + e.storageArea;

alert(str);

}

</script>

此时,如果 save 页面改变了存储区域的内容,就会自动触发 storage 事件,并把它发送给所有监听 storage 事件的页面。

需要注意的是,只有在数据的内容确实发生改变的时候,才会触发 storage 事件。如果把一个值设置成一模一样的值,或删除一个根本就不存在的存储项,则不会触发 storage 事件。并且,storage 事件只会发送给同源、而且处于打开状态的其它页面,而不会发送给触发改变的页面本身(即 save.html)及处于关闭状态的页面。因此,应当从Web服务器上获取本实例的页面。

HTML5 storage事件监听的更多相关文章

  1. storage 事件监听

    在公司的一次内部分享会上, 偶然知道了这个H5的新事件, 解决了我之前的一个bug. 事情是这样的, 第A网页上显示的数量的总和, 点击去是B页面, 可以进行管理, 增加或者删除, 当用户做了增删操作 ...

  2. html5 storage事件

    HTML5 虽然很多年了,但是真的了解不不够不够.主题说的是 storage时间,说起对 storage 事件的了解还是从 QQ音乐 说起. QQ音乐的主页是 https://y.qq.com , 而 ...

  3. 事件监听和window.history以及自定义创建事件

    1.事件监听window.addEventListener方法: Window.addEventListener(event, function, useCapture); useCapture:表示 ...

  4. Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  5. 4.JAVA之GUI编程事件监听机制

    事件监听机制的特点: 1.事件源 2.事件 3.监听器 4.事件处理 事件源:就是awt包或者swing包中的那些图形用户界面组件.(如:按钮) 事件:每一个事件源都有自己特点有的对应事件和共性事件. ...

  6. Node.js 教程 05 - EventEmitter(事件监听/发射器 )

    目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...

  7. .NET事件监听机制的局限与扩展

    .NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异. // C#someButton.Click += OnSomeB ...

  8. 让 select 的 option 标签支持事件监听(如复制操作)

    这标题,让option支持事件监听,应该不难的呀,有什么好讲的? 其实还是有的,默认在浏览器代码是无法直接对option标签进行操作的,不仅包括JS事件监听,还是CSS样式设置 查了一些资料,姑且认为 ...

  9. [JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

    -->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的oncl ...

随机推荐

  1. Kafka学习(三)-------- Kafka核心之Cosumer

    了解了什么是kafka( https://www.cnblogs.com/tree1123/p/11226880.html)以后 学习核心api之消费者,kafka的消费者经过几次版本变化,特别容易混 ...

  2. 小白学python-day05(2)-列表及其操作

    今天是day05(2),以下是学习总结 但行努力,莫问前程. --------------------------------------------------------------------- ...

  3. Go语言圣经习题练习_1.5. 获取URL

    练习 1.7: 函数调用io.Copy(dst, src)会从src中读取内容,并将读到的结果写入到dst中,使用这个函数替代掉例子中的ioutil.ReadAll来拷贝响应结构体到os.Stdout ...

  4. static import和import的区别

    import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....Cl ...

  5. web设计_2_灵活的文字

    最佳设计:可以让用户自由控制任何页面的文字大小. 浏览器中用户都是可以自定义默认的文字大小的,如果使用 px,用户自行在浏览器设置中改变了文字大小后,网页上是不会变化的.我们不能排除视障用户(如近视) ...

  6. spring与mybatis整合(扫描Mapper接口)

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ...

  7. Java中内部类的骚操作

      10.1 如何定义内部类 如代码10.1-1 所示 public class Parcel1 { public class Contents{ private int value = 0;​ pu ...

  8. Discuz论坛 自动加好友留言程序

    目录 [隐藏] 1 思路: 2 代码: 2.1 登录,获取Cookie: 2.2 获取FormHash: 2.3 发送加好友请求并留言: 思路: 一波未平一波又起, 拿到这个需求的时候对我来说还是有挑 ...

  9. jquery EasyUi 添加节点、展开所有节点、默认选中第一个节点

    感觉easyUi 的树用起来不如 Ext 的树方便,首先,root节点不太好自定义, 异步加载时,只能通过后台判断生成root节点,但是这样一来有一个问题,就是第一次访问界面时, 树的初始化比较慢,大 ...

  10. 【Java例题】8.1手工编写加法器的可视化程序

    1. 手工编写加法器的可视化程序. 一个Frame窗体容器,布局为null,三个TextField组件,一个Button组件. Button组件上添加ActionEvent事件监听器ActionLis ...