【发布时间】:2012-11-30 22:16:30
【问题描述】:
如何使用 jquery 获取外部 URL 的 HTML?
【问题讨论】:
如何使用 jquery 获取外部 URL 的 HTML?
【问题讨论】:
简短的回答是你不能,因为 AJAX 请求被 Same Origin Policy 限制在同一个(子)域和端口。
同样的限制适用于iframe 元素:您不能创建指向外部页面的iframe,并从那里获取其HTML。
通常的方法是使用服务器端脚本(例如用 PHP 编写)作为代理:它获取外部站点的内容并将其返回给 JavaScript。它必须与页面在同一个域上运行。
显然,使用此解决方案,对 URL、图像、样式表等(例如 ../images/image.gif)的相对引用将不再起作用,因为它们在您的页面上与上下文无关。无法判断这是否是您的情况的问题。一种解决方法可能是使用<base> tag。
【讨论】:
你需要 jquery $.get
http://api.jquery.com/jQuery.get/
示例:使用额外的数据负载(HTML 或 XML,取决于返回的内容)发出请求 test.cgi 的结果。
$.get("test.cgi", { name: "John", time: "2pm" },
function(data){
alert("Data Loaded: " + data);
});
编辑:这仅在您的页面位于同一域中时才有效。
【讨论】:
iframe 的 HTML
这是最简单的形式 - 你不能。
您已绑定same origin policy。
【讨论】:
您可以使用 $.ajax 或 $.get 调用您自己域中的 URL,然后使用您正在使用的任何服务器端语言来检索 HTML,然后返回它。
这是两个 HTTP 请求而不是一个,但它会解决您的问题。
您还可以在后端代码中缓存外部站点 HTML,这样来自 Javascript 的请求并不总是会导致两个 HTTP 请求 - 当然,这一切都取决于您想要获取的 HTML 更改的频率。
上面的一个小改动是在您的服务器上运行一个后台任务,该任务每 X 秒检索一次外部 HTMl 并将其保存在本地。来自您的 JS 对您的域的请求只是从您的服务器中获取最新的副本。这意味着您的 JS 请求不会因等待另一个外部 HTTP 请求而减慢。
【讨论】:
由于同源策略,所有常见浏览器都不允许 Javasript 调用访问具有另一个(子)域的任何页面。解决此问题的唯一方法是在您自己的服务器(例如 php 脚本)上设置某种“代理”,该服务器在同一域下运行,从第三个来源获取您想要的信息并将它们打印出来。
【讨论】:
您可以将 PHP 或任何其他服务器端语言添加到您的网站,以充当您的脚本的代理来获取页面 html。
然后,您可以使用 Ajax 使用该 url 调用您的服务器端代理,这将返回该页面的 HTMl。
【讨论】: