7

我知道MessageEventhassource属性是发送消息的窗口对象。现在如何让这些信息检查主文档中的哪个 iframe(当然还有消息到达时的主文档中)是该特定消息的来源?location.href是否只有检查窗口对象的可用选项event.source,然后循环所有 iframe 以检查哪个匹配?如果主文档中存在具有相同源 url 的 iframe 怎么办?

4

3 回答 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 回答