我有一个用于跨域网站的iframe。我想读取iframe的DOM,我相信这是可能的,因为使用检查器,我什至可以修改iframe的DOM。但是,无论尝试哪种方式,我都会遇到相同的原始策略。我想要的只是从iframe加载到本地DOM中的内容。我以为它就像
$(document.body).find('iframe').html()
一样简单,但是返回的是空字符串。我真的希望有一种方法可以这样做,因为我最近几天一直在做的工作已经确定可以做到。
感谢
#1 楼
你不能XSS保护。跨站点内容无法用javascript读取。没有主流的浏览器会允许您这样做。抱歉,但这是一个设计缺陷,您应该放弃这个主意。编辑
请注意,如果您具有对加载到iframe中的网站的编辑权限,您可以使用postMessage(另请参阅浏览器兼容性)
评论
如果您的意思是设计(流程)缺陷,那么不,这不是缺陷,这是出于安全性目的而实施的。
–伊布
2011年5月29日23:08
我知道它是出于安全原因而实现的,我的意思是基于此概念的设计缺陷(对此表示反对)。
–MáthéEndre-Botond
2011年5月29日23:30
那样的话我就会误会了
–伊布
2011年5月29日23:32
作为参考,跨域same-origin-policy意味着主机名,端口和协议必须全部相同-en.wikipedia.org/wiki/Same-origin_policy(例如,app1.example.com和app2.example.com不同; example.com和www.example.com是不同的)
–科蒂斯·雅洛普(Curtis Yallop)
16-10-26在18:08
注意:您可以使用window.postMessage在iframe和主窗口之间进行通信。
–科蒂斯·雅洛普(Curtis Yallop)
16-10-26在18:10
#2 楼
有一个简单的方法。您创建一个iframe,其源代码类似于“ http://您的domain.com/index.php?url=http://the -site-you-want-to-get.com/unicorn
然后,只需使用
$_GET
获取此网址,并使用file_get_contents($_GET['url']);
显示内容您将获得一个具有域的iframe与您的相同,那么您将可以使用
$("iframe").contents().find("body")
来操作内容。评论
您能解释一下细节吗?非常感谢你@@
– bfhaha
16 Mar 24 '16 at 15:50
对不起,我没注意到。 1.创建一个php页面,该页面显示来自GET参数的所需页面内容。 content.php <?php echo file_get_contents($ _ GET ['url']); ?> 2.然后,在您的主页中,添加将加载此页面的iframe。
#3 楼
如果您有权访问iframed页面,则可以使用easyXDM之类的东西在iframe中进行函数调用并返回数据。如果您无法访问iframed页面,则必须使用一个服务器端解决方案。
使用PHP,您可以快速又肮脏地执行以下操作:
<?php echo file_get_contents('http://url_of_the_iframe/content.php'); ?>
评论
我无法访问iframed页面,并且服务器端解决方案几乎是不可能的,因为我使用的是cocoahttpserver(服务器在iphone上运行)
– D-Nice
11年5月29日在22:56
在这种情况下,这是不可能的。有关更多详细信息,请参见en.wikipedia.org/wiki/Same_origin_policy。
– devmatt
2011年5月29日23:06
您先生是学者和绅士
–艾伦S
2014年5月15日9:22
感谢分配给您的想法,这个答案以及这个-stackoverflow.com/a/29501376/1521606帮助我创建了一个解决方法!干杯
–sputn1k
15年4月14日在8:04
@devmatt,使用file_get_contents($ _ GET ['url'])可以获取页面内容,但不能获取DOM内容!错误的答案。
–巴拉塔
18年7月25日在13:05
#4 楼
如果您有权访问已加载的域/ iframe,则可以使用window.postMessage在iframe和主窗口之间进行通信。在iframe中使用JavaScript读取DOM并通过postMessage发送到顶部窗口。
此处更多信息:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage
评论
我们如何使用js读取iframe中的DOM?有可能,不是吗?
–Thinh Vu
16 Dec 3'在12:36
您通常会阅读DOM。例如document.getElementsByTagName(“ BODY”)[0];之后,使用window.postMessage将您刚刚在iframed窗口中阅读的DOM对象发送到托管iframe窗口的窗口。
–Maksim Luzik
16/12/4在17:25
#5 楼
有一个解决方法。首先,将iframe绑定到具有相对URL的目标页面。浏览器会将iframe中的网站与您的网站视为同一个域。
在Web服务器中,使用重写模块将请求从相对网址重定向到绝对网址。如果使用IIS,建议您检查IIRF模块。
评论
您是说服务器将http重定向发送到外部位置吗?如果是这样,它至少在Firefox 9中不起作用。我认为其他浏览器也不会因此而被愚弄。
–安东·N
2012年1月31日上午7:11
他的意思是在服务器上重写请求,因此客户端不知道这不是正确的URL
–雷武
19年4月8日在2:32
评论
是的,您可以执行此操作-请参见stackoverflow.com/a/17262334/888177