代码之家  ›  专栏  ›  技术社区  ›  Peeja

如何构建与safari/webkit中的页面具有相同域的iframe

  •  3
  • Peeja  · 技术社区  · 16 年前

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

    诀窍 :小部件必须能够更改其大小。为此,它设置其包含iframe的 style.height . 这需要访问外部页面的DOM。在 火狐 工业工程 ,这是允许的,因为iframe的文档和外部文档被视为共享源。

    捻度 游猎 但是,这两个文件被认为是 共享来源。内部文档被认为位于 about:blank ,而外部文档显然使用了不同的协议和“域”(如果 blank 可以视为域)。

    问题 :我如何以编程方式构建一个iframe,其文档safari/webkit将考虑与创建它的窗口的文档具有相同的来源?


    编辑 :经过进一步的实验,我找不到一种以编程方式创建位置不是的iframe的方法。 关于:空白 不管我是否改变它的内容。

    如果我用 document.createElement() 给它一个 SRC 它指向一个真正的HTML资源,在同一个源代码上称为“foo.html”,并且 document.body.appendChild() 它是safari的控制台,在dom中按预期显示元素,但页面内容不显示,并且文档在侧边栏中列为“about:blank”。

    如果我直接在页面中包含iframe的HTML,则 foo.html 出现,边栏中出现“foo.html”。

    如果我使用 document.write() ,我得到的结果与 document.body.appendChild()。 .

    这两个编程版本都在Firefox中工作。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Andy E    16 年前

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

    你也可以试试

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

    不过,我不确定这是否只适用于IE。对不起,我不能比这更有用。

        2
  •  0
  •   Peeja    16 年前

    啊哈。这似乎是webkit中的一个bug。当以编程方式创建iframe时, src 属性被忽略。相反,框架默认为 about:blank 必须指向URL才能指向其他地方。例如:

    theIframe.contentWindow.location = theIframe.src