2

iframe B (bar.com の B.html など) を含むルート html ページ A (foo.com の A.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 のツリーを介したこの種のトラバーサルは可能です。

于 2013-03-08T20:01:18.550 に答える