3

场景:我正在编写一个可嵌入的小部件。它采用<script>标签的形式,它构建了一个 iframe,其中包含它需要显示的所有内容。iframe 没有src,脚本使用theIframe.contentWindow.document.write(). 这将保持小部件包含在内,并防止元素 ID 和脚本与嵌入小部件的页面发生冲突。

诀窍:小部件必须能够更改其大小。为此,它设置其包含 iframe 的style.height. 这需要访问外部页面的 DOM。在FirefoxIE中,这是允许的,因为 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 中使用。

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 回答