我知道MessageEvent
hassource
属性是发送消息的窗口对象。现在如何让这些信息检查主文档中的哪个 iframe(当然还有消息到达时的主文档中)是该特定消息的来源?location.href
是否只有检查窗口对象的可用选项event.source
,然后循环所有 iframe 以检查哪个匹配?如果主文档中存在具有相同源 url 的 iframe 怎么办?
问问题
1835 次
3 回答
2
遍历页面上的所有 iframe 并对它们的window
对象进行身份比较。
window.addEventListener('message', function(e) {
if(e.origin === 'https://www.example.com') {
var iframes = document.getElementsByTagName('iframe');
for(var i = 0; i < iframes.length; i++) {
if(e.source === iframes[i].contentWindow) {
// Do stuff with iframes[i]
}
}
}
}
我相信这适用于所有现代浏览器;我很想知道是否有人对此有问题。
于 2017-10-11T21:05:08.480 回答
1
如果您尝试读取location.href
跨域 iframe/窗口的属性,则会抛出异常,因为它违反了同源策略。您可以写入该属性,但无法读取. 即使这样可行,您也会遇到具有相同 URL 问题的多个 iframe 的问题,正如您所猜测的那样。
无论如何,您可以做的是 - 为某种消息发送确认建立协议。换句话说,在接收到消息 X 的 iframe 中,您将遍历父文档中的所有 iframe,并向每个 iframe 发送一条消息,询问“您是否向我发送了消息 X?” 你会编程所有的 iframe 来回答这些问题。当然,您必须将唯一 ID 附加到所有消息,以便您知道哪个 iframe 确认它发送了哪个消息。
我认为您必须考虑为什么消息的接收者需要知道发送者是谁,以及为什么您只知道对该发送者的引用(event.source
)是不够的?如果发件人知道某些信息 - 那么发件人可以首先在消息中发送此信息。
于 2012-09-17T12:01:09.513 回答
0
一种更有效的方法是在启动时为每个 iframe 传递一个唯一 ID,并让它们在回发到父框架时使用该 ID。
于 2014-08-05T03:09:45.547 回答