我有一个跨域站点的 iframe。我想读取 iframe 的 DOM,我认为这是可能的,因为使用检查器,我什至可以修改 iframe 的 DOM。然而,我尝试阅读它的每一种方式都遇到了同源策略。我想要的只是从 iframe 加载到本地 DOM 中的内容。我认为它会像 一样简单$(document.body).find('iframe').html()
,但这会返回空字符串。
我真的希望有一种方法可以做到这一点,因为我过去几天一直在做的工作是基于这是可行的。
谢谢
我有一个跨域站点的 iframe。我想读取 iframe 的 DOM,我认为这是可能的,因为使用检查器,我什至可以修改 iframe 的 DOM。然而,我尝试阅读它的每一种方式都遇到了同源策略。我想要的只是从 iframe 加载到本地 DOM 中的内容。我认为它会像 一样简单$(document.body).find('iframe').html()
,但这会返回空字符串。
我真的希望有一种方法可以做到这一点,因为我过去几天一直在做的工作是基于这是可行的。
谢谢
你不能。XSS 保护。javascript 无法读取跨站点内容。没有主流浏览器会允许你这样做。我很抱歉,但这是一个设计缺陷,你应该放弃这个想法。
编辑
请注意,如果您对加载到 iframe 中的网站具有编辑权限,则可以使用postMessage(另请参阅浏览器兼容性)
有一个简单的方法。
您创建了一个 iframe,它的源代码类似于“http://your-domain.com/index.php?url=http://the-site-you-want-to-get.com/unicorn
然后,您只需获取此 url$_GET
并显示内容file_get_contents($_GET['url']);
您将获得一个域与您的域相同的 iframe,然后您将能够使用$("iframe").contents().find("body")
来操作内容。
如果您有权访问iframe页面,则可以使用诸如easyXDM 之类的东西在 iframe 中进行函数调用并返回数据。
如果您无权访问 iframe 页面,则必须使用服务器端解决方案。使用 PHP,你可以做一些快速而肮脏的事情,比如:
<?php echo file_get_contents('http://url_of_the_iframe/content.php'); ?>
如果您有权访问加载的域/iframe,那么您可以使用 window.postMessage 在 iframe 和主窗口之间进行通信。
在 iframe 中使用 JavaScript 读取 DOM,并通过 postMessage 将其发送到顶部窗口。
更多信息:https : //developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
有一个解决方法来实现它。
首先,将您的 iframe 绑定到具有相对 url 的目标页面。浏览器会将 iframe 中的站点视为与您的网站相同的域。
在您的 Web 服务器中,使用重写module将请求从相对 url 重定向到绝对 url。如果您使用 IIS,我建议您检查IIRF module。