HTML5 postMessage 和 localStorage 实现窗口间通信
LocalStorage(不能跨域)
基本思想:通过localStorage的标准事件storage来实现跨页面通信,即页面A通过写入特定数据触发页面B的storage事件,页面B响应之后再写入数据通知页面A处理结果;
引言
随着Web技术的发展,涌出了越来越多的复杂的应用。诸多Web应用逐渐向增强用户体验方向发展。在诸如付款、在线聊天等场景中,有时需要多页面进行数据通信。以前的实现方法有cookie、服务器中转、Flash插件等方法,而HTML5提供了新的LocalStorage API,能够更为便捷的实现跨页面通信,且相比以前的技术有容量大、效率高、无需插件等优点。
“What”能实现什么
LocalStorage API被IE8+及Firefox、Chrome、Safari等主流浏览器所支持。利用localStorage能够实现数据的存储,而通过监控数据的写入,页面可以获得其它页面想要传达的信息。
在“在线聊天”功能中,服务器与客户端的数据通信需要占用大量的带宽和服务器计算时间,而如果一个浏览器同时打开了多个窗口更是雪上加霜。作为一个绿色环保的程序员,相对于堆服务器,我们应该立足于解决带宽与计算量的浪费,而通过跨页面的协同合作,我们可以实现多个页面之间可以共享一条数据通道,同时节省了服务器和客户端的消耗。
其它的诸如微博等应用的“换肤”功能,如果能够实现打开的多个窗口同时更换皮肤,势必能够提高用户的体验。
“Where”用在何处
上面已经提及了两处应用场景,实际上任何Web应用都应该考虑多窗口的情形。用于在窗口之间切换时,如何实现无障碍的应用体验?产品经理总是抱怨打开了多个窗口怎么就不能实现联动?在一个窗口登录了其它窗口怎么就非得刷新才能使用一些功能?这些统统可以通过跨页面通信解决。
“How”怎么实现
HTML5 LocalStorage API中包含了"storage"事件。通过监听window对象的storage事件,可以在其它页面窗口调用localStorage的存储方法时,得到通知。为了进行跨页面通信事件与普通存储事件的区分。
Storage类 有两个主要对象:localStorage和sessionStorage
属性:
length window.localStorage.length 有多少名值对存放在Storage对象中
方法:
setItem(name,value) window.localStrorage.setItem()
removeItem(name)
getItem(name)
key(index) 获取index位置处的 值的名字name
clear() 删除所有值
事件:
storage
对Storage对象进行任何修改 都会在文档上触发storage事件
侦听storage事件
window.addEventListener("storage",function(event){...});
event 对象有以下属性:
domain:发生变化的存储空间的域名
key:设置或者删除的键名
newValue: 设置--新值 删除--null
oldValue:键更改前的值
postMessage
发送 : otherWindow.postMessage(message, targetOrigin, [transfer]); //调用postMessage方法的window对象是指要接收消息的那一个window对象
监听 : message事件 window.addEventListener( "message", function(event) {alert(event.data);})
假设在a.html
里嵌套个<iframe src="http://www.b.com/b.html" frameborder="0"></iframe>
,在这两个页面里互相通信
示例:
a.com/a.html
window.onload = function() {
window.addEventListener("message", function(event) {
alert(event.data);
});
// window.frames[0].postMessage("b data", "http://www.b.com/b.html"); //调用postMessage方法的window对象是指要接收消息的那一个window对象
}
b.com/b.html
window.onload = function() {
// window.addEventListener("message", function(event) {
// alert(event.data);
// });
window.parent.postMessage("a需要的数据", "http://www.a.com/a.html");
}
对比:
postMessage是从a窗口发送信息到b窗口,b窗口监听到消息后做出回应;而localStorage是在a窗口改变某一个存储值,b窗口监听到了存储值的变化,然后获取该值,进而完成通信的同样的效果。
HTML5 postMessage 和 localStorage 实现窗口间通信的更多相关文章
- node-webkit 新建实例窗口间通信问题解决办法
终于弄明白这问题了,只要在js文件里加上段代码,就可解决两窗口间通信问题. var str = { username: User.name, userrole: User.role }; var ne ...
- electron窗口间通信
以下代码均来自于我开发的开源软件:想学吗 窗口A的渲染进程发消息给主进程 const { clipboard, ipcRenderer, remote } = require('electron'); ...
- [转]html5: postMessage解决跨域和跨页面通信的问题
[转]html5: postMessage解决跨域和跨页面通信的问题 平时做web开发的时候关于消息传递,除了客户端与服务器传值,还有几个经常会遇到的问题: 多窗口之间消息传递(newWin = wi ...
- html5: postMessage解决跨域通信的问题
效果图 postmessage解析 HTML5提供了新型机制PostMessage实现安全的跨源通信. 语法 otherWindow.postMessage(message, targetOrigin ...
- HTML5 postMessage 跨域交换数据
前言 之前简单讲解了利用script标签(jsonp)以及iframe标签(window.name.location.hash)来跨域交换数据,今天我们来学习一下HTML5的api,利用postMes ...
- HTML5 postMessage 和 onmessage API 具体应用
HTML5 postMessage 和 onmessage API 具体应用 随着 HTML5 的发展.了解并熟悉 HTML5 的 API 接口是很重要的.postMessage(send) 和 on ...
- 跨域问题实践总结!下( [HTML5] postMessage+服务器端(反向代理服务器+CORS Cross-Origin Resource Sharing))
4. [HTML5] postMessage 问题: 对于跨域问题,研究了一下html5的postMessage,写了代码测试了一下,感觉html5新功能就是好用啊.此文仅使用html5的新特性pos ...
- python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)
昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...
- windows下进程间通信与线程间通信
进程间通信: 1.文件映射(Memory-Mapped Files) 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/ ...
随机推荐
- Xpath语法与lxml库
1. Xpath 1 )什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. 2) X ...
- 5.Linux系统的vim与软件包管理
5.1 Linux系统的vim编辑器 5.1.1 vim编辑器的概述 vim编辑器的简介 1.vim是什么? vim是一个类似vi的文本编辑器,它在vi的基础上增加了很多新特性 vim是vi发展出来的 ...
- 爬虫系列(三) urllib的基本使用
一.urllib 简介 urllib 是 Python3 中自带的 HTTP 请求库,无需复杂的安装过程即可正常使用,十分适合爬虫入门 urllib 中包含四个模块,分别是 request:请求处理模 ...
- 第十节:numpy之数组文件操作
1.安装ipython 2.创建txt文件 3.直接上代码:
- i++与++i的区别及效率
i++与++i的区别及效率 先看看基本区别:i++ :先在i所在的表达式中使用i的当前值,后让i加1++i :让i先加1,然后在i所在的表达式中使用i的新值 看一些视频教程里面写for循环的时候都 ...
- Vue项目搭建及原理四
四.Vue-cli工作原理及Vue实例创建,工作原理 (一)Vue-cli原理 1.webpack其实使用了node.js的express网页服务器来进行处理网页相关的数据,相当于使用一个类似apac ...
- jQuery学习----简单介绍,基本使用,操作样式,动画
jQuery简单介绍 jq是js的插件库,说白了,jq就是一个js文件 凡事能用jq实现的,js都能实现.但是js能实现的,jq不一定能够实现 jq的引入 http://www.bootcdn.cn ...
- Java web如何定位工程路径
一 项目路径的获得 System.getProperty("user.dir"); 可以获得当前用户的工作目录,即在哪个地方启动的java程序,返回就是当前目录 二 web项目根目 ...
- N天学习一个linux命令之yum
yum命令 用途 yum(Yellowdog Updater Modified),RedHat系Linux操作系统包管理器,基于rpm,从源远程仓库下载rpm包安装,同时解决依赖关系,使用Python ...
- WinCE:在Win7上连接WinCE手持设备
当我们通过usb将WinCE 手持设备与Win7 PC连接后,我们通常希望通过Windows Mobile Center软件与手持设备实现同步.方法很简单,从下列列表中选择适合自己操作系统的Windo ...