javascript postmessage 不起作用

ano*_*non 3 html javascript frontend web

我有 2 个网站,我想postMessage在它们之间使用 javascript。在我的主站点上,我在 emty html 文件中编写以下代码:

<html>

<script>

window.addEventListener("message",listener_,false);
function listener_(event) {
    console.log('ok!');
    <html>

<script>

window.addEventListener("message",listener_,false);
function listener_(event) {
    console.log('ok!');
    //console.log(event);
    //console.log(event.data);

}

</script>

</html>
Run Code Online (Sandbox Code Playgroud)

在其他站点中,我想调用 postmessage,我编写以下代码:

<script type="text/javascript">
    window.onload = function() {
    testfunction();
    };
function testfunction(){


    var childWin = window.open("http://my-main-site.com/indexjava2.html","child");
    childWin = postMessage('message','*');


    console.log(TipaltiIframeInfo.height);


}

</script>
Run Code Online (Sandbox Code Playgroud)

但经过多次尝试后还是不行。我的意思是 console.log('ok!'); 或console.log(事件); console.log(事件.数据);

不会在主站点的控制台上触发,

该怎么办?谢谢

Clo*_*kex 5

除了在接收页面的代码中间有一个<script>和 一个标签并且定义和添加事件侦听器两次之外,您也没有正确使用。而不是这个:<html>postMessage

childWin = postMessage('message', '*');
Run Code Online (Sandbox Code Playgroud)

……应该是这样的:

childWin.postMessage('message', '*');
Run Code Online (Sandbox Code Playgroud)

如果您想了解更多信息postMessage请阅读本文

另一个问题是,除非在发送消息之前打开页面,否则新打开的页面不会收到该消息。您尝试在打开新页面后立即发送消息,并且消息在添加事件侦听器之前到达新页面。您可以使用 a 来解决这个问题setTimeout,但是如果新页面需要更长的时间来加载,那么这也可能不可靠。

// This is what NOT to do:
setTimeout(function() {
    childWin.postMessage('message', '*');
}, 1000);
Run Code Online (Sandbox Code Playgroud)

相反,更好的方法是让子页面在加载时通​​知父页面。然后父母和孩子就可以可靠地沟通。


这是完整的更正代码,首先发送页面:

<script>
    var childWin;

    window.addEventListener('message', messageListener, false);

    function messageListener(event) {
        if(event.data == 'ready') {
            childWin.postMessage('hello second page', '*');
        }
    }

    window.onload = function() {
        childWin = window.open('http://my-main-site.com/indexjava2.htm', 'child');
    };
</script>
Run Code Online (Sandbox Code Playgroud)

以及接收页面:

<script>
    window.addEventListener('message', messageListener, false);

    function messageListener(event) {
        console.log(event.data);
    }

    window.opener.postMessage('ready','*');
</script>
Run Code Online (Sandbox Code Playgroud)