postMessage的基本用法
postMessage可以解决跨域的传值问题,一般可以认为是父页面向子页面传递消息。
发送数据(父页面):
otherWindow.postMessage(message, targetOrigin, [transfer]);
otherWindow:其他窗口的一个引用,可以是window.open(‘xxx’)、window.opener等等(目前只用过这两种)。
message:将要发送的数据,基本上什么都可以放。
targetOrigin:目标源,通过窗口的origin属性指定哪些窗口可以接受消息,其值可以是字符串’*'或者一个URL(协议+主机+端口号[+URL])。如果清楚知道消息发送到哪里,填入确定的URL可以防止消息被恶意第三方截取。
transfer:没有使用过这个属性,可选择项,官方说明:是一串和message 同时传递的 Transferable 对象. 这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。
接受数据(子页面):
window.addEventListener(“message”, receiveMessage, false);
观察别人的文章博客说明,最好使用上面的操作,如果通过onmessage监听接受数据,有些浏览器无法识别。
正文:
window.open打开新页面时需要一些时间来加载,直接window.open.postMessage有可能页面没加载完就发送,子页面的事件监听尚未设置,消息传输失败。
window.open('xxx').onload = () => {
otherWindow.postMessage(message, targetOrigin, [transfer]);
}
页面加载完毕再进行post,我感觉思路挺正确的,不知为何,我失败了
setTimeout(() => winopen.postMessage(this.userSession, targetUrl), 3000);
设置时间等页面刷新完再发送消息,成功了,但是在给领导演示的过程中翻车了,因为页面刷新太久了o(╥﹏╥)o,所以等待的时间很难控制。
this.timeOfmsg = setInterval(() => {
winopen.postMessage(this.userSession, targetUrl);
}, 3000);
通过定时器,不断发送,无论页面刷新多久都能收到消息啦(^-^)V,但是一直搞一个定时器占用了内存,于是在接受页面中设置了反馈消息。
window.addEventListener('message', (e) => {
if ('xxx') {
window.opener.postMessage('getMsg', '*');
}
}, false);
然后在发送页面同样设置消息监听,收到消息后清空定时器。
window.addEventListener('message', (e) => {
if (e.data === 'getMsg') {
clearInterval(this.timeOfmsg);
}
});
时隔多年hhhh更新一下我觉得比较好的方法