2

我有一个根 html 页面 A(比如 foo.com 上的 A.html),其中包含一个 iframe B(比如 bar.com 上的 B.html)。iframe B 包含另一个 iframe C(foobarfoo.com 上的 C.html)。

当用户单击父页面 A 中的某些内容时,我试图通知 iframe C。

由于两个子 iframe(B 和 C)与父 A 位于不同的域中,因此无法访问 iframe 属性或调用脚本。

我可以控制 A.html 和 C.html 中的代码,并且可以使用 html5 postmessaging 选项来发送消息。我尝试将邮件从 A 发送到 B,效果很好,但是直接从 A 发送到 C 是我正在努力解决的问题。

如果我尝试使用 document.parentWindow.frames 访问嵌套的 iframe C,我只会得到 iframe B 而不是 iframe C。这是预期的吗?

如果我首先从 DOM 获取 iframe B,然后尝试使用 getElementByID 获取 iframe C,我会收到拒绝访问错误,这很明显,因为 iframe B 位于不同的域上并且不允许查询其 DOM。

这是我尝试过的两个选项的代码...

选项1

function postMessage1()
{
    var message = new Object;
    message["MessageId"] = "NewPage";
    var messageData = JSON.stringify(message);

    var domain = 'http://localhost';
    var allFrames = document.parentWindow.frames;
    var iframe = allFrames['frameC'];

    iframe.postMessage(messageData, domain); -----> iframe is null here as it cannot find any frame with the ID - frameC.
}

选项2

function postMessage2()
{
    var message = new Object;
    message["MessageId"] = "NewPage";
    var messageData = JSON.stringify(message);

    var domain = 'http://localhost';
    var proxyFrame = document.getElementById("frameB");
    var targetFrame = proxyFrame.getElementById("frameC");  ----> Access denied to getElementByID in frame B as it is from a different domain and accessing its DOM is not allowed.

    targetFrame.contentWindow.postMessage(messageData, domain);
}

我正在尝试使用 window.postMessage 查找是否有解决方案。任何帮助表示赞赏。

4

1 回答 1

1

您需要做的是使用来自 iframe B 的 frames 属性的引用来访问 iframe C。因此,基本上,您递归地访问 A 的 frames 属性以获取 B,然后访问 B 的 frames 属性以获取 C:

function postMessage()
{
    var message = new Object;
    message["MessageId"] = "NewPage";
    var messageData = JSON.stringify(message);

    var domain = 'http://localhost';
    var iframeB = document.parentWindow.frames['frameB'];
    var iframeC = iframeB.frames['frameC']; // or iframeB.frames[0]; if C is the only iframe in B

    iframeC.postMessage(messageData, domain);
}

还没有尝试过上面的代码,但是这种遍历 iframe 的树是可能的,因为 frames 属性不属于同源策略。

于 2013-03-08T20:01:18.550 回答