3

シーン: 埋め込み可能なウィジェットを作成しています。<script>これは、表示する必要があるすべてを含む iframe を構築するタグの形式をとります。iframe には がなくsrc、スクリプトは で書き込みますtheIframe.contentWindow.document.write()。これにより、ウィジェットが含まれたままになり、要素 ID とスクリプトがウィジェットが埋め込まれているページと競合しなくなります。

秘訣: ウィジェットはサイズを変更できる必要があります。これを行うには、それを含む iframe を設定しますstyle.height。これには、外側のページの DOM へのアクセスが必要です。FirefoxおよびIEでは、iframe のドキュメントと外側のドキュメントがオリジンを共有すると見なされるため、これが許可されます。

ひねり:ただし、 Safariでは、2 つのドキュメントはオリジンを共有していないと見なされます。内側の文書は にあると見なされますがabout:blank、外側の文書は明らかに異なるプロトコルと「ドメイン」を使用しています (ドメインblankと見なすことができる場合)。

質問: Safari/WebKit がそれを作成するウィンドウのドキュメントと同じオリジンを持つと見なすドキュメントの iframe をプログラムで構築するにはどうすればよいですか?


編集about:blank:さらに実験を重ねた結果、内容を変更するかどうかに関係なく、位置が変わらない iframe をプログラムで作成する方法が見つかりません。

でフレームを作成し、document.createElement()srcfoo.html」と呼ばれる同じオリジンの実際の HTML リソースを指す を指定するdocument.body.appendChild()と、Safari のコンソールは DOM で期待どおりに要素を表示しますが、ページのコンテンツは表示されません。が表示され、ドキュメントはサイドバーに「about:blank」としてリストされます。

iframe の HTML をページに直接含めると、コンテンツがfoo.html表示され、サイドバーに「foo.html」が表示されます。

を使用して HTML を挿入すると、 を使用した場合とdocument.write()同じ結果が得られdocument.body.appendChild()ます。

どちらのプログラム版も Firefox で動作します。

4

2 に答える 2

1

私が与えることができる最善の提案は、iframeを同じサーバー上の空白のページ(つまり、blank.html)に設定してから、コンテンツを編集することです。後部の痛み、私は知っていますが、それは回避策です。

あなたも試すことができます

iframe.contentDocument.open("replace");
iframe.contentDocument.write("<b>This is some content</b>");
iframe.contentDocument.close();

ただし、それがIEでのみ機能するかどうかはわかりません。申し訳ありませんが、それ以上に役立つことはできませんでした。

于 2009-06-29T16:17:25.603 に答える
0

あはは。これは WebKit のバグのようです。iframe がプログラムによって作成される場合、そのsrc属性は無視されます。代わりに、フレームはデフォルトabout:blankで URL にリダイレクトされ、別の場所を指すようにする必要があります。例えば:

theIframe.contentWindow.location = theIframe.src
于 2009-06-29T19:55:07.150 に答える