跨页面通讯
通常,对于两个不同页面的脚本,只有当执行它们的页面具有相同的协议(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.