html 如何交换数据,Html5 postMessage 跨域交换数据

平时做web开发的时候关于消息传递,除了客户端与服务器传值还有几个经常会遇到的问题

1.页面和其打开的新窗口的数据传递

2.多窗口之间消息传递

3.页面与嵌套的iframe消息传递

4.以上跨域数据传递

HTML5新增API,postMessage是用于两个窗口(iframe)之间的数据交换,通信。

语法:window.postMessage(data,targetOrigin)

postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。

NO .1 页面与嵌套的iframe消息传递

父页面文件路经 domain1/father.html,启动端口 http://127.0.0.1:3001

var iframe = document.getElementById('iframe')

// 窗口加载完

iframe.onload = function () {

// 向目标源发送数据

var data = {}

iframe.contentWindow.postMessage(JSON.stringify(data), 'http://127.0.0.1:3002')

}

// 监听有没有数据发送过来

window.addEventListener('message', function (e) {

console.log('data from domain2 --->', e.data) //打印结果 :{"name":"Sear","number":16}

}, false)

子页面文件路经 damain2/son.html,启动端口 http://127.0.0.1:3002

// 监听有没有数据发送过来

window.addEventListener('message', function(e) {

var data = {}

data.name = 'Sear';

data.number = 16;

// // 回发数据

e.source.postMessage(JSON.stringify(data), 'http://127.0.0.1:3001/father.html');

}, false);

我分别启动两个不同的服务,子页面通过iframe 嵌入父页面,通过postMessage()通信,实现数据交换。父传子,子传父。抛数据 --> 监听数据 的过程

NO.2 窗口与窗口间消息传递

窗口1文件路经 domain1/tab.html,启动端口 http://127.0.0.1:3001

var popup = window.open('http://127.0.0.1:3002/tab.html')

setTimeout(function () {

popup.postMessage({name:'Sear'},'http://127.0.0.1:3002')

},1000)

窗口2文件路经 domain2/tab.html,启动端口 http://127.0.0.1:3002

// 设置监听,如果有数据传过来,则打印

window.addEventListener('message', function(e) {

console.log(e.data);

});

这里要设置一个定时器的原因是模拟向目标窗口发送数据必须等目标窗口完全加载完,也就是说要在目标窗口中先设置好“监听器”,发送窗口发的数据才能被监听到,所以给了个定时器delay.

安全性

postMessage采用的是“双向安全机制”。发送方发送数据的时候,会确认接受方的源(所以最好不要用*),而接受方监听到message事件后,也可以用event.origin判断是否来自于正确可靠的发送方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值