iframe及跨域通信postMessage()

本文深入探讨了window.postMessage()方法的使用,包括如何在父子页面间传递信息,以及如何实现动态创建并操作iframe。重点阐述了如何利用postMessage()进行跨域通信,并提供了实例代码。

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

一、 window.postMessage()

   window.postMessage(info,origin)方法可以接受两个参数

1.info:要传递的数据,可以为json格式(因为我比较喜欢json格式的)部分浏览器只能处理字符串参数,所以我们在传递参数的时候需要使用JSON.stringify()方法对对象参数序列化

2.origin:字符串参数,指明目标窗口的源,协议+主机+端口号[+URL],URL会被忽略,所以可以不写,这个参数是为了安全考虑,postMessage()方法只会将message传递给指定窗口,也可以建参数设置为"*",这样可以传递给任意窗口。

二、子页面向父级页面传递信息及子页面接收信息

//子页面向父级页面传递信息
//传递的参数随意 看个人理解
window.onload = function() {
    window.parent.postMessage({  //与父级页面通讯方法
    type: "onload",              //父级接收的信息 
    data:"do something"         //如果传递的信息为object(数组或者json格式)需要转换成字符串
  }, '*');
}
//object转换字符串方法:JSON.stringify(obj)


//子页面接收信息 与父页面接收信息相同
window.addEventListener('message', function(e) {
     console.log(e)   //这里打印一下看里面的内容
     var data = e.data;       
     if(data && data.type && data.type == 'set') { //判断一下 
          conosle.log(data)
          console.log(data.data); //打印出来看一下
          // do something
     }
},false)

三、父级页面监听信息及父页面向子页面传递信息

//父页面接收信息 js 监听事件 事件名称'message'
window.addEventListener('message', function(e) {
     console.log(e)   //这里打印一下看里面的内容
     var data = e.data;       
     if(data && data.type && data.type == 'onload') { //判断一下 
          conosle.log(data)
          console.log(data.data); //打印出来看一下
          // do something
     }
},false)



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

四、动态创建iframe及设置iframe内容

//创建iframe

var box=document.getElementById('box');
//方法一 字符串方式写入

var box.innerHtml='<iframe frameborder="0" width="100%" height="100%" scrolling="no" marginheight="0" marginwidth="0" hspace="0" vspace="0" allowtransparency="true"></iframe>';

方法二 动态创建(这种方式要写的东西有点长)
var Frame = document.createElement('iframe');
Frame.height = '100%';
Frame.width = '100%';
Frame.scrolling = 'no';
Frame.setAttribute('frameborder', 0);
Frame.setAttribute('hspace', 0);
Frame.setAttribute('vspace', 0);
Frame.setAttribute('allowtransparency', true);
box.appendChild(Frame);

//获取iframe的win doc 可以给iframe设置一个id 方便查找
var iwindow = box.getElementsByTagName('iframe')[0].contentWindow;
var idoc = iwindow.document;


//下面用write写入就可以了
idoc.write('hello world');
//关闭iframe的doc 写入
idoc.close();

//然后我们还可以再次设置iframe的属性 比如高度 让iframe不出现滚动条使 适应内容的高度
iwindow.onload = function() {
    Frame.height= idoc.documentElement.scrollHeight + 15 + 'px';
}

### 如何使用 `iframe.contentWindow.postMessage` 进行窗口消息传递 #### 基本概念 `iframe.contentWindow.postMessage` 是一种用于实现不同窗口或框架之间安全通信的方法。通过该方法,可以在主页面与其嵌套的 `<iframe>` 或其他窗口之间交换数据。 以下是具体说明: - **targetWindow**: 表示接收消息的目标窗口,在这里指代的是 `<iframe>` 的内容窗口,即 `iframe.contentWindow`[^1]。 - **message**: 需要发送的数据,可以是一个简单的字符串或者复杂的 JSON 对象(需注意序列化)。 - **targetOrigin**: 定义目标窗口的源地址。如果设置为 `"*"`, 则允许任何来源的窗口接收到消息;但如果可能的话,建议指定确切的 URL 来提高安全性[^2]。 #### 示例代码 以下是一段完整的例子来演示如何利用 `iframe.contentWindow.postMessage()` 实现窗口通信: ```javascript // 主页向 iframe 发送消息 var iframe = document.getElementById('myIframe'); // 获取 iframe 元素 if (iframe && iframe.contentWindow) { var message = { type: 'greeting', text: 'Hello from parent!' }; iframe.contentWindow.postMessage(JSON.stringify(message), '*'); } ``` 在上述代码片段中,我们首先获取到名为 `'myIframe'` 的 iframe 元素,并确认其存在以及拥有有效的 `contentWindow` 属性之后才调用了 `postMessage` 函数。 对于另一端——也就是被嵌入的 iframe 页面,则可以通过监听事件的方式捕获到来自外部的消息并作出响应: ```javascript // 在 iframe 中监听来自父级页面的消息 window.addEventListener('message', function(event) { try { const data = JSON.parse(event.data); if (data.type === 'greeting') { console.log(`Received greeting: ${data.text}`); // 向父页面回复一条消息 event.source.postMessage({type:'response',text:`Thanks! Received your "${data.text}"`}, event.origin); } } catch(err){ console.error("Invalid JSON received", err); } }); ``` 此部分脚本设置了针对 `'message'` 类型事件的一个处理程序。当有新消息到达时,它会尝试解析传入的内容,并依据特定条件执行相应操作后再回传给原始发件方[^3]。 #### 注意事项 为了保障系统的稳定性和用户的隐私保护,请务必遵循如下准则: - 设置精确而非通配符形式 (`"*"`) 的 origin 参数以限定合法的目的地; - 对所有输入/输出数据实施严格的验证机制以防恶意攻击行为的发生; - 不要在生产环境中暴露敏感信息于此类交互过程中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

招来红月

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

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

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

打赏作者

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

抵扣说明:

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

余额充值