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