【发布时间】:2010-11-06 17:50:38
【问题描述】:
场景:我正在编写一个可嵌入的小部件。它采用<script> 标记的形式,它构建一个包含它需要显示的所有内容的 iframe。 iframe 没有src,脚本用theIframe.contentWindow.document.write() 写入它。这将保持小部件包含在内,并防止元素 ID 和脚本与嵌入小部件的页面发生冲突。
诀窍:小部件必须能够更改其大小。为此,它设置其包含 iframe 的 style.height。这需要访问外部页面的 DOM。在 Firefox 和 IE 中,这是允许的,因为 iframe 的文档和外部文档被认为共享一个来源。
转折:然而,在 Safari 中,这两个文档被认为不共享一个来源。内部文档被认为位于about:blank,而外部文档显然使用了不同的协议和“域”(如果blank 可以被认为是域)。
问题:如何以编程方式构建一个 iframe,其文档 Safari/WebKit 会认为与创建它的窗口的文档具有相同的来源?
编辑:经过进一步的实验,无论我是否更改其内容,我都找不到以编程方式创建位置不是 about:blank 的 iframe 的方法。
如果我使用document.createElement() 创建框架,给它一个src,它指向一个名为“foo.html”的真实HTML 资源,然后document.body.appendChild() 它,Safari 的控制台会按预期显示该元素在 DOM 中,但是页面的内容没有出现,并且文档在侧边栏中被列为“about:blank”。
如果我直接在页面中包含 iframe 的 HTML,则会出现 foo.html 的内容,并且边栏中会出现“foo.html”。
如果我使用 document.write() 插入 HTML,我会得到与 document.body.appendChild() 相同的结果。
两个程序化版本都可以在 Firefox 中使用。
【问题讨论】:
标签: javascript iframe safari webkit same-origin-policy