web-dev-qa-db-ja.com

document.domainを短くした後、iframe contentWindowがAccess Deniedエラーをスローする

以下の方法でIFRAMEを動的に作成します。

var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';
wrapUpIframe.src = 'WrapUpDialog.html';    
document.body.appendChild(wrapUpIframe);

動的な作成後、私のdocument.domainServername.dc.comからdc.comのみに短縮されます。

しかし、contentWindowにアクセスしようとすると、アクセス拒否のエラーが発生しました。

document.getElementById("WrapUpDialog3").contentWindow.SomeFunction();

注: IFRAMEをHTMLで静的に定義すると、正常に動作します。
また、IFRAME document.domainを次のように変更しようとしました:

WrapUpDialog3.document.domain = dc.com;

document.domainとIFRAMEドメインの両方を確認しましたが、どちらも同じです。

私に何ができる?

IE9を使用しています。

10
Dor Cohen

まず post から正しい答えを見てください。それはあなたの問題かもしれないように私には思えます。

そうでない場合は、おそらく別の post から見たこの簡単なハックが役立つかもしれません。

 var frame = $('<iframe>')
.attr('id', 'myIframe')
.addClass('someClass')
.attr('src', 'javascript:(function () {' +'document.open();document.domain=\'myDomain.net\';document.close();' + '})();');
.appendTo($('#someDiv'));

これが関連しているかどうかはわかりませんが、Webでもこれを見つけました link

では、コメントに返信してください。 JavaScript関数はソースを割り当てていません。ドキュメントドメインを設定していますが、IEで正しく実行されていないようです。

別の例と説明については、この link を確認してください。

だから私が試してみるのはこのようなものかもしれません...

var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';    
wrapUpIframe.src = setSrc();
document.body.appendChild(wrapUpIframe);

function setSrc(){document.open();document.domain=\'dc.com\';document.close();return 'WrapUpDialog.html';}

ドキュメントドメインを設定する関数を実行した後、iframeの実際のURLを返す方法を試さなければならない場合があります。しかし、私が見ていることから、これはあなたのために働くかもしれません。

私は同様の問題を抱えていましたが、まったく同じ問題ではなかったため、正確な修正を提供することはできません。ドキュメントドメインを設定する機能は、アクセス拒否エラーを回避するためのものです。

これをメインドキュメントに追加して、ドメインが確実に一致するようにすることもできます。

 <script type="text/javascript">
    document.domain = 'dc.com';
  </script>

また、以前使用したdocument.domainを明示的に設定することについての説明のために link を追加したかった。これは過去に私にとって役に立ちました。特にこの引用...

値を明示的に設定すると、別のサブドメイン(同じ親ドメインの下)のスクリプトと「連携」する意図があることを示します。

ドー、タイミングの問題があるかもしれません。テストしたばかりのコード(ここ)が見つかりました。 contentWindowにアクセスする前に、iframeが読み込まれていることを確認します。

var iframe = document.createElement("iframe");
iframe.src = "WrapUpDialog.html";

if (iframe.attachEvent){
    iframe.attachEvent("onload", function(){
        alert("Local iframe is now loaded.");
    });
} else {
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
}

document.body.appendChild(iframe);

var iframeWindow = iframe.contentWindow || iframe.contentDocument.parentWindow;
9
Vic

どのようにファイルを提供しますか?アドレスバーにfile:///が表示されていますか?その場合は、ウェブサーバーを使用してコードを提供してみてください。

Google Chromeがfile:///を使用してコードを試した場合、アクセス拒否エラーが発生しますが、ローカルWebサーバーから提供されたときに機能します(つまり、アドレスはhttp://localhost/で始まります)。

2

あなたがまだ与えられた答えをまだ受け入れていないので、あなたはおそらくまだ問題を抱えています。

両方のHTMLページでdocument.domainを明示的に設定してみてください(これは1つのページでのみ行うようです)。つまり、@ Vicが示唆したように、iframeを含むHTMLに次のJavaScriptコードを追加する必要があります。

document.domain = 'dc.com';

つまり、コードは次のようになります。

document.domain = 'dc.com';
var wrapUpIframe = document.createElement("iframe");
wrapUpIframe.id = 'WrapUpDialog3';
wrapUpIframe.src = 'WrapUpDialog.html';    
document.body.appendChild(wrapUpIframe);

次に、WrapUpDialog.html自体(メインページではなく、セキュリティシステムを回避するためです)で、document.domainも設定する必要があります。

document.domain = dc.com;

したがって、あなたのこの行は機能しません:

WrapUpDialog3.document.domain = 'dc.com';

WrapUpDialog.html自体が、その「親」ページにそのJavaScriptを実行する許可を与える必要があるためです。

このページには詳細があります: document.domain = document.domainの機能

最後のヒント:さまざまなブラウザー(IE9、Firefox、Google Chrome)を使用してコードを試してください。これは、おそらく特定のブラウザの癖を扱っているかどうかを識別するのに役立ちます。

1