我正在尝试使用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事件。因此,当存在不同的域时,没有任何效果(postMessageonload)...

最佳答案

您无法访问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/

10-12 12:43