GitHub:https://github.com/roomanl/eventJShtml
这几天作一个web项目有这样一个需求,web项目是一个后台管理系统,在使用系统时会打开不少标签页,每一个标签页就是一个iframe打开的一个新的html页面,如今须要在每一个标签页之间互相通讯、互相调用方法。例如:打开了A,B,C三个标签页,我在C页面把数据修改了,我要通知A,B两个页面的数据也要更新到最新修改的数据。git
在网上看到的解决办法都是用iframe 父页面与子页面互相调用方法,可是用这种方法感受一点都不灵活,不是很好用,有很大的局限性。github
后来在使用localStorage存储的时候发现localStorage有这样一个特性。web
在A界面监听storage事件。浏览器
window.addEventListener("storage", function (e) {tomcat
alert(e.key+'='+e.newValue);服务器
});htm
在B页面修改或添加了localStorage。blog
localStorage.setItem('key', 'value');事件
而后A界面的监听事件里就能够接收到通知。
利用这个特性我封装了一个JS,代码以下:


用法很简单,在全部页面都引入上面的JS,而后在A,B页面添加监听事件。

C页面对数据进行了修改后就发一个通知给A,B页面,让A,B页面进行相应的操做。

就这样一个多页面之间互相通讯调用的JS就封装好了,iframe与iframe之间的页面能够互相通讯调用。浏览器每一个标签页之间的页面也能够互相通讯调用。
不过须要注意如下几点:
一、 互相通讯调用之间的几个页面要放在服务器环境,例如放在IIS或者tomcat之类的服务容器里。
二、 打开的几个页面要是同源页面,也就是几个页面之间IP相同,端口相同。
三、 打开的几个页面必须是在同一个浏览器。
四、 发送通知传的参数如今还只能是字符串,若是要传JSON类型,请先在C页面转字符串,在A,B接收到通知后,再把字符串转回JSON。
五、同一个页面接收不到同一个页面发送的通知,固然谁也不会作这种事,在同一个页面接收同一个页面发送的通知。