我正在尝试使用postMessage
在两个窗口之间发送一些数据。但是,没有通知目标窗口,我找不到原因。这是我的代码:
原始页面(localhost:8080 / index.html):
<body>
<a onclick="popupCenter('http://localhost:58810');"
href="javascript:void(0);">CLICK TO OPEN POPUP</a>
<script>
function popupCenter(url) {
const yoyo = window.open(url);
yoyo.onload(function() {
yoyo.postMessage("Hello mate", "*");
});
//setTimeout(yoyo.postMessage.bind(this,"Hello mate", "*"), 3000);
}
</script>
</body>
我已经尝试了上述代码的两个版本:一个内部注释和一个上面的注释。他们都不起作用...
目标页面(localhost:58810 / index.html):
<body>
<script>
window.addEventListener("message", function(event) {
if (event.origin !== 'http://localhost') {
console.log("Far away");
return;
}
console.log("Yes!!!", event.data);
});
</script>
Hello world!!
</body>
目标页面通常会在新窗口中加载。但是,即使所有解决方案(stackoverflow和其他站点)都建议
postMessage
解决了跨域问题,它也不会获得源页面发送的消息。知道为什么吗?为了使问题更大,不会触发
onload
事件。因此,当存在不同的域时,没有任何效果(postMessage
和onload
)... 最佳答案
您无法访问yoyo窗口,这就是为什么需要postMessage的原因,因此无法在此窗口上设置onload。最干净的方法可能是两种方式的消息传递。像这样:
const messageFromChild = function(childWindow,event){
if(event.origin === "http://localhost:58810"){
childWindow.postMessage("Hello mate", "*");
}
}
function popupCenter(url) {
const yoyo = window.open(url);
window.addEventListener('message', messageFromChild.bind(this,yoyo));
}
在目标窗口中:
window.onload = function(){
window.opener.postMessage("I'm loaded!", "*");
}
window.addEventListener("message", function(event) {
if (event.origin !== 'http://localhost:8080') {
console.log("Far away");
return;
}
console.log("Yes!!!", event.data);
});
关于javascript - postMessage不发送数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50159364/