如何读取从另一个域加载页面的iframe的DOM?

时间:2008-12-02 23:30:56

标签: dom browser iframe activex cross-browser

如果iframe中的文档位于其他域上,是否可以通过父文档访问iframe中文档的DOM?如果父页面和子页面都位于同一个域中,我可以轻松访问它,但是当它们位于不同的域时,我需要能够这样做。

如果没有,也许还有其他方法可以读取iframe的内容(一个考虑因素是创建一个ActiveX控件,因为这只适用于公司内部使用,但我希望它是跨浏览器兼容的)?

3 个答案:

答案 0 :(得分:3)

不是真的。这对于安全性至关重要 - 否则你可以打开我的网上银行网站或网络邮件并搞乱它。

您可以document.domain设置my.example.com/proxy?url=otherdomain.com/page ,但顶级域名必须相同。

您可以通过自己的服务器代理请求来解决此限制(但不要忘记保护它,否则s [cp] ammers可能会滥用它)

{{1}}

答案 1 :(得分:1)

理论上您可以使用标准DOM level2 contentDocument属性访问iframe的内容。 实际上您可能已经发现,由于安全问题,大多数浏览器都拒绝访问外部文档的DOM。 无法访问完整的DOM AFAIK(尽管可能会有一些特定于浏览器的调整来禁用同域检查);对于跨域XHR,一个流行的技巧是使用URL片段标识符(参见例如this link)在iframe和主文档中来回反弹数据,您可以使用相同的技术但是:

  • iframe中加载的文档必须合作,
  • 你无论如何都无法访问完整的文档(你可以回读一些参数,或者你可以尝试对整个文档进行URL编码 - 但那会非常难看)

答案 2 :(得分:0)

我刚刚发现了HTML5引入的postMessage方法;它已经在最近的浏览器中实现(FF3,IE8和Safari 4)。它允许在浏览器内的任何Windows对象之间交换消息。 有关详细信息,请参阅MDC上的文档以及John Resig的此nice tutorial