window.postMessage() 方法允许来自一个文档的脚本可以传递文本消息到另一个文档里的脚本,不用管是否跨域。一个文档里的脚本还是不能调用在其他文档里方法和读取属性,但他们可以用window.postMessage结合window.addEventListene这种消息传递技术来实现安全的通信。

window.addEveantListener('message',(event)=>{}) 

event 的属性有:

  • data: 从其他 window 传递过来的数据副本。 
  • origin: 调用 postMessage 时,消息发送窗口的 origin。例如:“http://www.localhost:8080”。
  • source: 对发送消息的窗口对象的引用。可以使用此来在具有不同 origin 的两个窗口之间建立双向数据通信。

使用的场景:

1. 不同 origin 的两个窗口之间建立双向数据通信(不同端口下的窗口,不能网站地址)


// localhost:9999/index页面
// 接收消息
window.addEventListener('message', (e) => {
     console.log(e.data)
})
// 发送消息
const targetWindow = window.open('http://localhost:8888/user');
setTimeout(()=>{
     targetWindow.postMessage('来自9999的消息', 'http://localhost:8888')
}, 3000)
/**
// localhost:8888/user页面
window.addEventListener('message', (e) => {
     console.log(e.data)
     if (event.origin !== "http://localhost:9999") 
     return;
     e.source.postMessage('来自8888的消息', e.origin)
})

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

在引用iframe的index.html页面中:

<iframe id="iframe" src="./demoIframe"></iframe>

<script>
var iframe = document.getElementById('iframe');
iframe.onload = function() {
   // 向domain2发送跨域数据
   iframe.contentWindow.postMessage('来自index.html的消息', 'index.html');
};
// 接受demoIframe返回数据
window.addEventListener('message',(e) => {
    console.log(e.data);
}, false);
</script>

在iframe的demoIframe.html页面中:

<script>
// 接收index.html的数据
window.addEventListener('message',(e) => {
    console.log(e.data);
 
    if(e.origin !== 'index.html')
    return;
    // 发送消息给index.html
    window.parent.postMessage('来自demoIframe.html的消息', e.origin);
}, false);
</script>
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐