参考自文档:https://www.runoob.com/js/met-win-postmessage.html
postMessage 方法用于安全地实现跨域通信。
涉及到通信,则会有信息发送方 和 信息接收方。
发送方,调用 postMessage 方法,发送 message ,接收方,在 window 下监听 message 方法,接受传来的数据。
<!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>postMessage</title>
</head>
<body>
<div>
<input id="text" type="text" value="Runoob" />
<button id="sendMessage1">发送消息1</button>
<button id="sendMessage2">发送消息2</button>
</div>
<iframe
loading="lazy"
id="receiver"
src="./postmessageget.html"
width="300"
height="360"
>
<p>你的浏览器不支持 iframe。</p>
</iframe>
<script>
// message 发送:postmessage方法调用者:谁需要数据,谁调用
// message 接收:window下监听 message 事件
window.onload = function () {
let val = document.getElementById("text").value;
// 发送消息1 iframe
let receiver = document.getElementById("receiver").contentWindow; // 得到就是 iframe 的 window 对象
let btn1 = document.getElementById("sendMessage1");
btn1.addEventListener("click", function (e) {
e.preventDefault();
// postmessage.html:33 Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://c.runoob.com') does not match the recipient window's origin ('http://127.0.0.1:5500').
// receiver.postMessage("Hello " + val + "!", "https://c.runoob.com"); // 限制 targetOrgin 之后,如果该 iframe src不为指定域名,则无法发送 数据
receiver.postMessage("Hello " + val + "111", "*"); // * 可以发送成功
});
// 发送消息2 window.open ,会同时打开 postmessageget 网页
let otherWindow = window.open("./postmessageget.html");
let btn2 = document.getElementById("sendMessage2");
btn2.addEventListener("click", function (e) {
e.preventDefault();
otherWindow.postMessage("Hello " + val + "222", "*"); // * 可以发送成功
});
};
window.addEventListener("message", function (e) {
console.log("父页面收到:", e.data);
});
</script>
</body>
</html>
postmessage.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>window.postMessage() 跨域消息传递测试</title>
</head>
<body>
<div id="recMessage">Hello World!</div>
<script>
window.onload = function () {
var messageEle = document.getElementById("recMessage");
window.addEventListener("message", function (e) {
console.log("e", e);
messageEle.innerHTML =
"从" + e.origin + "收到消息: " + JSON.stringify(e.data);
console.log("子页面收到:", e.data);
let top = window.top;
top.postMessage("子页面说你好");
});
};
</script>
</body>
</html>