使用window.postMessage()方法跨域通信

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用window.postMessage()方法跨域通信相关的知识,希望对你有一定的参考价值。

window.postMessage() 方法可以安全地实现跨源通信(不是二个tab浏览器签,而是一个页面中嵌套的iframe的跨源通信)。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

window.postMessage() 方法被调用时,会在所有页面脚本执行完毕之后向目标窗口派发一个 MessageEvent 消息。

该MessageEvent消息有四个属性需要注意:
  • message 属性表示该message 的类型;
  • data 属性为 window.postMessage 的第一个参数;
  • origin 属性表示调用window.postMessage() 方法时调用页面的当前状态;
  • source 属性记录调用 window.postMessage() 方法的窗口信息。
发送消息

要将数据发送到另一个窗口,应该在发送消息的窗口上执行postMessage()方法。

下面列出了postMessage()具有的两个参数:
  • message:它是要发送到另一个窗口的数据(字符串或对象);
  • targetOrigin:它是发送消息的窗口的URL 。目标窗口的协议,端口和主机名必须与要发送的消息的此参数匹配。设置“*”将匹配任何URL,但不建议用于安全风险。
获取目标窗口有两种方法:
  • 通过该window.open()方法,该open()方法将返回对新窗口的引用;
// 打开百度官网,在浏览器的console中输入  ->(1)
window.addEventListener('message',event=>
  if (event.source === window) return;
  console.log('this window');
);
let opens = window.open('https://www.baidu.com')
//在新打开的百度页面中输入  ->(2)
window.addEventListener('message',event=>
  if (event.source === window) return;
  console.log('this open');
);
window.opener.postMessage(,'https://www.baidu.com'); // 在(2)页面中会打印'this window'
// 回到(1)中输入
window.opens.postMessage(,'https://www.baidu.com');

  • 在iframe中可以实现跨域调用

// 打开京东页面console下输入
window.addEventListener('message',event=>
  if (event.source === window) return;
  console.log('jd.com');
);

const iframebaidu = document.createElement('iframe');
iframebaidu.src="https://www.baidu.com";
iframebaidu.name="iframebaidu";
document.body.append(iframebaidu);


// 切换到baidu窗口下见下图
window.addEventListener('message',event=>
  if (event.source === window) return;
  console.log('baidu.com');
);
window.parent.postMessage(,'https://www.jd.com'); // 打印jd.com

// top window
window.frames.iframebaidu.postMessage(,'https://www.baidu.com'); // 打印baidu.com


浏览器支持
该postMessage()支持下面列出的浏览器版本。自版本8以来,Internet Explorer已包含支持。

IE8+
FIREFOX3.0+
CHROME1.0+
SAFARI4.0+
OPERA9.5+

以上是关于使用window.postMessage()方法跨域通信的主要内容,如果未能解决你的问题,请参考以下文章

使用window.postMessage()方法跨域通信

使用window.postMessage()方法跨域通信

window.postMessage解决跨域

使用 postMessage + iframe 实现跨域通信

解决Iframe跨域高度自适应,利用window.postMessage()实现跨域消息传递页面高度(JavaScript)

HTML5中window.postMessage,在两个页面之间的数据传递