iframe的跨域问题

时间:2012-01-31 20:19:10

标签: javascript ajax

我知道跨浏览器域调用的解决方案。使用JSONP,进行代理调用或接受服务器上的域。我今天在我公司发现了一种更奇怪的方式。

方法:

他们正在使用这个 -

更改主机以匹配第二台服务器的主机
window.location.host = "xyz.com";
          or
document.domain = "xyz.com";

然后他们正在创建一个隐藏的iframe并在iframe中获取内容并将内容替换为可见元素。

问题:

它适用于iframe,但如果我执行ajax调用,则无效。对此有何评论?

1 个答案:

答案 0 :(得分:3)

我不是jsonp的粉丝,它创建了数据和演示之间的耦合,所以我之前研究过这个问题,而且,有一个技巧你可以使用,请按照下面这样说:

假设我们有一个名为A的主窗口和名为B的iframe中的“子”窗口。 A和B必须从同一主机提供,但可以有不同的子域,例如:

  

A从sub1.example.com

提供      

B从sub2.example.com

提供

浏览器允许您更改文档的域名,但仍然限制您,因此您只能通过删除子域来更改域,直到您到达主机,因此在A中您更改域名,如下所示: / p>

document.domain = "example.com";

在B中,您首先对其域(sub2.example.com)进行ajax调用,然后在发送第一个请求后更改域,就像在A中一样,这样两个文档都具有相同的域。 由于您向B中的原始域发出请求,浏览器将允许您继续向其发送请求,但由于您还更改了域,现在A和B具有相同的域,因此它们可以相互通信。

在更改域之前,首先在B中向其原始域中至少生成一个请求非常重要。 此外,如果两个页面都不是来自同一主机,它将无法工作,因此在大多数情况下它不能解决问题,但它确实可以让你有更多的操作空间。

我不止一次使用过这个技巧并且没有遇到任何问题,据我所知,它适用于所有浏览器,如果在某些情况下它没有,请告诉我。

这是一个伪示例:

in A
==================
document.domain = "example.com";
var child; // keep reference to B
function setChild(win) {
    childDocument = win;
}

function handleMessage(message) {
    do what ever it is you need to
}

in B
==================
make ajax request
document.domain = "example.com";
parent.setChild(this);

function ajaxCallback(message) {
    parent.handleMessage(message);
}