【问题标题】:javascript postMessage not workingjavascript postMessage不工作
【发布时间】:2011-06-20 13:18:20
【问题描述】:

我不知道该怎么办。我尝试了几个来自不同来源的示例代码,我在不同的浏览器(从 Chrome 9 到 FF 4)中尝试了它们,但似乎仍然没有任何东西可以使用“postMessage”功能。 JS 控制台什么也没给我,没有一个错误,仍然没有发生任何事情:框架不想通信。完全没有。这甚至不是跨域的:两个框架都来自我的域。

这是上次尝试的示例代码: 父框架:

<iframe src="IFRAME_URL"></iframe>
<script>
    window.addEventListener( "message",
      function (e) {
            if(e.origin !== 'DOMAIN'){ return; } 
            alert(e.data);
      },
      false);
</script>

子框架:

<html>
<head></head>
<body>
    <script>
        top.postMessage('hello', 'DOMAIN');
    </script>
</body>

帮助非常感谢,非常感谢

【问题讨论】:

  • 您的 iframe 中是否只有 2 个级别?可能是 top 不是你的听众被声明的地方。可以试试parent.postMessage
  • 用 parent.postMessage 试过了,还是不行
  • 您是否尝试过我的回答:stackoverflow.com/questions/3457391
  • 好的,我得到了它的工作......显然 DOMAIN 不能以斜杠结尾。叹息。
  • 啊...我刚刚尝试了一个真实的网址,并且效果很好。可能必须有一个/是的:)

标签: javascript iframe postmessage


【解决方案1】:

postMessage的第二个参数必须是http://localhost之类的url

【讨论】:

  • 或者,参数可以是 "*"... 我强烈不建议将其用于测试目的。
【解决方案2】:

如果您不处理不同的来源,输入location.origin 作为targetOrigin 将起作用。

top.postMessage('hello', location.origin);

【讨论】:

    【解决方案3】:

    您也可以使用top.postMessage('hello', "*");将消息发送到任何窗口

    HTML 1:

    <iframe src="IFRAME_URL"></iframe>
    <script>
    window.addEventListener( "message",
      function (e) { 
            alert(e.data);
      },
      false);
    </script>
    

    html 2:

    <html>
    <head></head>
    <body>
        <script>
            top.postMessage('hello', '*');
        </script>
    </body>
    

    【讨论】:

      【解决方案4】:

      我不确定安全问题,但通常我只是像这样抓取父窗口位置:

      var url = (window.location != window.parent.location) ? document.referrer: document.location;
      top.postMessage('message', url);
      

      【讨论】:

      • 结果是每个在他的页面中包含您的 iframe 的人都会收到消息。 Afaik 它与使用“*”作为来源一样不安全。
      猜你喜欢
      • 2023-04-06
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多