2010-08-15 103 views
3

我需要在页面内部显示页面,如iframe,但使用jQuery。这些页面不在同一台服务器上。jQuery,ajax,在其他页面内显示页面(如iframe)

主页面是一个cms内的html页面,需要嵌套的页面是一个包含图像或音频文件列表的媒体页面,位于另一个服务器上。媒体页面上的高度会有所不同,所以我有点想远离iframe ......是否有一个简单的jquery调用,可以像iframe一样抓取页面......或者如果js被转向,则会降级到iframe在浏览器级别关闭?

谢谢。

+1

这里的问题是'其他服务器'位。对Javascript的跨域限制意味着Javascript所做的任何*操作都不能与其运行的域之外的域进行交互。您是否考虑过服务器端解决方案? – 2010-08-15 02:36:17

+0

你看,事情是,你可以想象通过服务器传递请求'获取'一个页面,从而解决了跨域问题(比如我对这个问题的回答http://stackoverflow.com/questions/ 3232668/is-there-a-way-to-mitigate-downloading-of-resources-images-css-and-js-files-wit/3448206#3448206),但它*仍*不会复制什么'iframe'这是因为该页面上的CSS和Javascript会“溢出”并影响到父页面,而不像包含它的底部框架。 – 2010-08-15 03:23:23

回答

2

除非您的外部内容是与您的主网站在同一个域中提供的,否则使用AJAX进行这样的事情并不容易,因为您碰到了same origin policy

解决同一起源策略的一个解决方案是在服务器上设置一个简单的reverse proxy,这将允许浏览器为AJAX请求使用相对路径,而服务器将充当任何代理偏远的地点。

如果在Apache中使用mod_proxy,则设置逆向代理的基本配置指令是ProxyPass。它通常被用作如下:

ProxyPass  /external/  http://other-domain.com/ 

在这种情况下,浏览器将能够请求/external/index.html作为相对URL,但服务器会通过充当代理http://other-domain.com/index.html服务于这个。

然后,在JavaScript,你将能够使用jQuery的load()方法如下:

$('#your_div').load('external/index.html'); 

另一种方法是使用iframe,并用JavaScript动态地调整它的高度。您可能需要检查以下堆栈溢出职位,关于这一主题延伸阅读:

您可能还需要考虑一个完整的服务器端解决方案如@Yi Jiang建议在上面的评论。您可以将HTML从外部网站注入主站点,然后将其提供给客户端的浏览器。

+0

谢谢大家。我会尝试一下代理,如果这不起作用,我可能会因为js高度的iframe。 – Jeffrey 2010-08-15 03:39:24

0

您将很难从其他域获取Ajax内容。浏览器不会允许它阻止跨站点脚本攻击(XSS)。您可以使用基于php的代理,cURL或Google Ajax API。

另一种方法是只使用一个iframe,并让JavaScript获取内容高度,并将iframe高度设置为相同(加上填充使浏览器不显示滚动条)。

0

根据定义,Ajax只能在同一个服务器上工作,这是由于相同的源策略。你需要做的是从另一台服务器上载入一个PHP文件的页面(我们称之为xxx.php)。 然后,您可以在DIV YYY加载xxx.php用下面的代码:

$("#yyy").load("xxx.php"); 
2

Mozilla已经加入跨站点请求。这是一个新的HTML5标准。但常见的是不允许跨站点请求。所以你必须做一些前面提到的事情。如果您将使用PHP解决方案,请使用:

<?php 
    $external = file_get_contents($_POST['external']); 
    echo $external; 
?> 

$().post("ajax.php", {external: "http://www.example.com/"}, function(data) { 
    html = $("div#extract", data).html(); 
    $("div#insert").html(html); 
}, "html");