使用jQuery获取外部URL的HTML

18

我该如何使用jQuery获取外部URL的HTML?

6个回答

20
短暂的回答是不行的,因为 AJAX 请求受到同源策略的限制,只能在相同(子)域和端口之间进行。 iframe 元素也受到相同的限制:您不能创建指向外部页面的 iframe 并从那里获取其 HTML。
通常的方法是使用服务器端脚本(例如 PHP 编写),作为代理:它获取外部站点的内容并将其返回给 JavaScript。它必须在与页面相同的域上运行。
显然,使用此解决方案,对于 URL、图像、样式表等的相对引用(例如 ../images/image.gif)将不再起作用,因为它们超出了您页面的上下文。是否在您的情况下存在问题无法确定。其中一种解决方法可能是使用 <base> 标签

1
@KushalJayswal 这正是我提到的“作为代理服务器端脚本”的那种类型。它带来了许多问题,其中一个问题就是该网站目前处于离线状态,可能是由于负载过重造成的。对于任何专业用途而言,该服务与“我们可以做到”相去甚远。 - Pekka

6

您需要使用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);
   });

编辑:仅当您的页面在同一域上时,此方法才有效。


不可能:由于同源策略,父级JavaScript无法访问iframe的HTML。 - Pekka
那么就完全没有解决方案 :) - Stefanvds

4
在最简单的形式下 - 你无法做到。 你受到同源策略的限制。

可以禁用。 - Geremia

3
您可以使用 $.ajax 或者 $.get 来调用您自己域名下的 URL,然后使用您正在使用的任何服务器端语言来检索 HTML,并将其返回。
虽然这样需要进行两个 HTTP 请求,但它可以解决您的问题。
您还可以在您的后端代码中缓存外部站点的 HTML,以便 JavaScript 的请求不总是导致两个 HTTP 请求 - 当然,这取决于您想要获取的 HTML 更改的频率。
对上述方法稍作修改,您可以在服务器上运行一个后台任务,每 X 秒检索一次外部 HTMl 并将其保存在本地。您 JS 的请求只需从您的服务器中获取最新的副本。这意味着您的 JS 请求不会因等待另一个外部 HTTP 请求而变慢。

1

由于同源策略,所有常见的浏览器都不允许JavaScript调用访问具有不同(子)域的任何页面。唯一的解决方法是在自己的服务器上设置某种类型的“代理”(例如PHP脚本),该代理在相同的域下运行,从第三方获取所需信息并将其输出。


0
你可以在网站上添加PHP或其他服务器端语言,作为代理来获取页面的HTML代码。
然后,你可以使用Ajax调用你的服务器端代理程序,并传入URL参数,以便获取该页面的HTML代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接