0

我正在使用 2 个本地域,localhost并使用来自两个域domain1的 iFrame 来测试系统。postMessaging

我可以正确识别相应的window元素(在两个域上)以发送消息和接收回复。我的问题是,在我的 postMessage 中发送的第二个参数(我从中发送消息的 URL)未被相应其他域上的侦听器接受。仅当我将发件人声明为 时"*",我的消息传递才有效。

这不起作用向外部域发送消息:

 // targetWindow = window of foreign domain
 targetWindow.postMessage({
    "foo": "bar"
  }, window.location.href);

这有效:

 // targetWindow = window of foreign domain
 targetWindow.postMessage({
    "foo": "bar"
  }, "*");

对发送域的回复也一样(使用window.top)。这不起作用:

 window.top.postMessage({
  "baz": "bam"
}, window.location.href.split("?")[0]);

虽然这样做:

window.top.postMessage({
  "baz": "bam"
}, "*");

问:
为什么会这样?我想我必须提供send-url作为第二个参数来启用身份验证。如果是这样,为什么我的事件没有触发?我在 localhost/domain1 上工作的原因是什么?

感谢帮助!

4

1 回答 1

1

第二个婴儿车是 targetOrigin,这是阻止您的消息被拦截的安全限制。它应该设置为消息发送到的窗口域,而不是消息来自的域。

这是一个使用 iframe 设置第二个字段的示例,它从 iFrame中获取src值并将其分解为协议 + 域 + 端口。这是设置目标原点所需要的。

var target = iframe.src.split('/').slice(0,3).join('/');
iframe.contentWindow.postMessage('foo', target);
于 2015-09-08T17:19:27.973 回答