记一次跨窗口通信

357 阅读1分钟

跨页面通讯

通常,对于两个不同页面的脚本,只有当执行它们的页面具有相同的协议(HTTPS),端口(444为https的默认值),以及主机(两个页面的模数设置为相同)时,这两个脚本才能相互通信。 window.postMessage可以安全实现跨域通信。

pageA:地址为http://192.168.3.2:3001/

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>PageA(http://192.168.3.2:3001/)</title>
</head>
<body>
  <textarea id="showMessage"></textarea>
  <button id="post">发功消息</button>
  <script>
    const textarea = document.getElementById('showMessage')
    const btn = document.getElementById('post')
    let msg = null
    btn.addEventListener('click',function(){
      !msg?msg= window.open('http://192.168.3.2:3000/'):""
      msg &&msg.postMessage(textarea.value,'http://192.168.3.2:3000/');
    })
    window.addEventListener('message',function($event){
      if($event.source!== 'http://192.168.3.2:3000/') return false
      msg = $event.source
      textarea.value = $event.data
    },false)
  </script>
</body>
</html>

pageB:地址为http://192.168.3.2:3000/

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>PageB(http://192.168.3.2:3000/)</title>
</head>
<body>  
  <textarea id="showMessage"></textarea>
  <button id="post">发功消息</button>
  <script>
    opener&&opener.postMessage('新的页面打开成功','http://192.168.3.2:3001/')
    const textarea = document.getElementById('showMessage')
    const btn = document.getElementById('post')
    window.addEventListener('message',function($event){
        if($event.source!== 'http://192.168.3.2:3001/') return false
        textarea.value = $event.data
    },false);
    btn.addEventListener('click',function(){
      opener.postMessage(textarea.value,'http://192.168.3.2:3001/')
    })
  </script>
</body>
</html>

opener:为window自带的属性,为通过window.open打开的窗体的父窗体。PageB是PageA通过window.open打开的,故PageB的opner指向PageA.