gpt4 book ai didi

javascript - 如何在 Safari/WebKit 中构建与页面具有相同域的 iframe

转载 作者:行者123 更新时间:2023-11-29 15:54:13 25 4
gpt4 key购买 nike

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

技巧:小部件必须能够更改其大小。为此,它设置其包含 iframe 的 style.height .这需要访问外部页面的 DOM。在 FirefoxIE 中,这是允许的,因为 iframe 的文档和外部文档被认为共享一个来源。

扭曲:然而,在 Safari 中,这两个文档被认为共享一个来源。内部文件被认为是在 about:blank , 而外部文档显然使用了不同的协议(protocol)和“域”(如果 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 中运行。

最佳答案

我能给出的最佳建议是将 iframe 设置为同一服务器上的空白页面(即 blank.html),然后编辑内容。我知道后背疼痛,但这是一种解决方法。

你也可以试试

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

但是,我不确定这是否只适用于 IE。抱歉,我帮不上忙了。

关于javascript - 如何在 Safari/WebKit 中构建与页面具有相同域的 iframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1059104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com