window.open.postMessage用法

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有可能页面没加载完就发送,子页面的事件监听尚未设置,消息传输失败。

  1. onload
window.open('xxx').onload = () => {
	otherWindow.postMessage(message, targetOrigin, [transfer]);
}

页面加载完毕再进行post,我感觉思路挺正确的,不知为何,我失败了

  1. setTimeout
setTimeout(() => winopen.postMessage(this.userSession, targetUrl), 3000);

设置时间等页面刷新完再发送消息,成功了,但是在给领导演示的过程中翻车了,因为页面刷新太久了o(╥﹏╥)o,所以等待的时间很难控制。

  1. setInterval
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更新一下我觉得比较好的方法

  1. 子页面onload完毕以后,向父页面发送加载完毕的消息
  2. 父页面收到加载完毕的消息以后,先子页面发送usersession,这样子页面必定能获取到目标消息了
    注意点:记得取消监听事件

你可能感兴趣的:(JavaScript,javascript,前端,开发语言)