我正在与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"
}, "*");
问题:
为什么会这样呢?我想我必须提供发送url作为第二个参数来启用身份验证。如果是,为什么我的事件没有触发?是我在localhost/domain1工作的原因吗?
谢谢你的帮助!
第二个程序是targetOrigin,这是一个安全限制,以防止您的消息被截获。它应该设置为消息被发送到的窗口域,而不是消息来自的窗口域。
下面是一个使用iframe设置第二个字段的示例,它从iframe中获取src值,并将其切割为协议+域+端口。这是设定目标原点所需要的。
var target = iframe.src.split('/').slice(0,3).join('/');
iframe.contentWindow.postMessage('foo', target);