シーン: 埋め込み可能なウィジェットを作成しています。<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 で動作します。