10

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

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

動的な作成後、mydocument.domainはからに短縮されServername.dc.comますdc.com

しかし、アクセスしようとするcontentWindowと、アクセスが拒否されましたというエラーが表示されます。

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

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

WrapUpDialog3.document.domain = dc.com;

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

私に何ができる?

私はIE9で作業しています。

4

3 に答える 3

9

まず、この投稿の正解を見てください。それがあなたの問題かもしれないように私には見えます。

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

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

これが適切かどうかはわかりませんが、Webリンクでも見つかりました。

OK、コメントに返信します。javascript関数はソースを割り当てていません、それは明らかにIEで正しく行われないドキュメントドメインを設定しています

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

だから私がしようとするのはこのようなものかもしれません...

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を明示的に設定する方法についての説明へのリンクを追加したいと思いました。これは過去に私に役立ちました。特にこの引用...

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

ドー、タイミングの問題があるかもしれません。テストしたばかりのコード(ここ)を見つけました。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;
于 2013-03-06T18:36:26.560 に答える
2

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

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

于 2013-03-07T19:16:16.740 に答える
1

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

両方の 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.htmljavascript を実行するには、それ自体が「親」ページにアクセス許可を付与する必要があるためです。

このページに詳細があります:ドキュメント.ドメイン = ドキュメント.ドメインは何をしますか? .

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

于 2013-03-10T10:27:08.297 に答える