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/ ...
随机推荐
- web前端学习总结--JQuery
jQuery 什么是jQuery jQuery是一个优秀的JavaScript框架,一个轻量级的JS库. 它封装了JS.CSS.DOM,提供了一致的.简洁的API. 兼容CSS3,及各种浏览器 使用户 ...
- time、datatime模块
python中时间日期格式化符号 %Y 年份(4位数表示) %y 年份(2位数表示) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数 %I 12小时制小时数 %M 分 ...
- generating multiple ordered files in python
Goal: To generate =35= files named 'capitalsquiz1.txt', 'capitalsquiz2.txt'...'capitalsquiz35.txt' * ...
- Ubuntu | Flask + Gunicorn + Nginx 部署服务器环境
现在我们手里有一个准备发布的项目,那么如何将他上传到你的服务器,并让外网访问呢? 前提: 1. 安装了Python环境 apt-get install python-dev 2. 安装Flask pi ...
- IDEA 工具使用报错总结
读前语:此文章仅给非入门级观看 1.使用Debug 无法运行,而使用Run 则正常启动,报错代码如下 1 Error running 'jx_web': Unable to open debugge ...
- shell面试题整理
1.给一个放有IP的文件,其中一个IP一行,统计哪个IP出现的次数最多. ip_input.txt内容如下: 219.217.49.14 175.43.4.87 87.48.98.1 59.73.38 ...
- 洛谷 P2195 HXY造公园
P2195 HXY造公园 题目描述 现在有一个现成的公园,有n个休息点和m条双向边连接两个休息点.众所周知,HXY是一个SXBK的强迫症患者,所以她打算施展魔法来改造公园并即时了解改造情况.她可以进行 ...
- Bitcask存储模型
----<大规模分布式存储系统:原理解析与架构实战>读书笔记 近期一直在分析OceanBase的源代码,恰巧碰到了OceanBase的核心开发人员的新作<大规模分布式存储系统:原理解 ...
- js获得子页面元素
在主页面中.添加iframe子页面,假设须要获得子页面的元素则能够使用javascript的contentWindow来获得,注意iframe和frameset必须加入id.详细样例例如以下: mai ...
- oc51--循环retain
// main.m // 循环retain #import <Foundation/Foundation.h> #import "Person.h" #import & ...