iframe嵌套网页使用window.postMessage()跨域通信

本文深入解析了跨域问题的根源及解决策略,重点介绍了postMessage()方法的使用,包括其语法、参数说明及示例代码,帮助开发者实现不同源之间的安全有效通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 什么是跨域

  • 跨域,指的是浏览器不能执行其他网站的脚本。
  • 它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
  • 所谓同源是指相同的域名、协议和端口,只要其中一项不同就为跨域。
  • 举几个例子:
地址1地址2协议域名端口是否跨域
http://web.a.com/index.htmlhttp://web.a.com/page.html相同相同相同
http://web.a.com/index.htmlhttp://web.b.com/page.html相同不同相同
http://web.a.com:8080/indexhttp://web.a.com:8081/index相同相同不同
http: //web.a.com/index.htmlhttps: //web.a.com/page.html不同相同相同

2. postMessage()语法

otherWindow.postMessage(message, targetOrigin, [transfer]);
  • otherWindow
    其他窗口的一个引用,写的是你要通信的window对象。
    例如在iframe中向父窗口传递数据时,可以写成window.parent.postMessage()window.parent表示父窗口。
  • message
    需要传递的数据,字符串或者对象都可以,对象需要序列化(JSON.parse()),详细用法请转到:https://blog.youkuaiyun.com/github_38336924/article/details/96423264
  • targetOrigin
    表示目标窗口的源,协议+域名+端口号,如果设置为“ * ”,则表示可以传递给任意窗口。
// 可以传递给任意窗口
window.parent.postMessage('hello world','*');

在发送消息的时候,如果目标窗口的协议、域名或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;只有三者完全匹配,消息才会被发送。

// 只有父窗口为 http://web.a.com/index.html 接收到消息 
window.parent.postMessage('hello world','http://web.a.com/index.html');
  • 发送消息
window.parent.postMessage('hello world','http://web.a.com/index.html');
  • 接收消息
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
	console.log(event.data)  //event.data为传递过来的数据
    console.log(event.origin)  //event.origin为调用 postMessage 时消息发送方窗口的 origin(域名、协议和端口)
    console.log(event.source)  //event.source为对发送消息的窗口对象的引用,可以使用此来在具有不同origin的两个窗口之间建立双向通信
}

3. demo

3.1 子窗口 一> 父窗口传递信息

  • 子窗口 code
//子页面向父级页面传递信息
window.onload = function() {
    window.parent.postMessage({  //与父级页面通讯方法
    type: "onload",              //父级接收的信息 
    data:"do something"         //如果传递的信息为object(数组或者json格式)需要转换成字符串
  }, '*');
}
 
 
//子页面接收信息 与父页面接收信息相同
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
	console.log(event);
}
  • 父窗口 code
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
	console.log(event);
}

3.2 父窗口 一> 子窗口传递信息

  • 父窗口 code
// 父页面向子页面传递信息 contentWindow.postMessage方法与window.postMessage相似
var iframe=document.getElementById("iframe");
iframe.contentWindow.postMessage({
    type: "set",
    content:"hello world"
}, "*");

//父页面接收信息 与子页面接收信息相同
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
	console.log(event);
}
  • 子窗口 code
// 子页面接收信息
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
	console.log(event);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dadeity

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值