Javascript 带iframe的跨域问题

Javascript 带iframe的跨域问题,javascript,ajax,Javascript,Ajax,我知道跨浏览器域调用的解决方案。使用JSONP、执行代理调用或接受服务器上的域。今天在我的公司里,我又发现了一种奇怪的方法 方法: 他们正在使用此命令更改主机以匹配第二台服务器的主机- window.location.host = "xyz.com"; or document.domain = "xyz.com"; 然后,他们创建一个隐藏的iframe,获取iframe中的内容,并将内容替换为可见元素 问题: 它与iframe一起工作,但如果我调用ajax,它就不工作了。有

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

方法:

他们正在使用此命令更改主机以匹配第二台服务器的主机-

window.location.host = "xyz.com";
          or
document.domain = "xyz.com";
然后,他们创建一个隐藏的iframe,获取iframe中的内容,并将内容替换为可见元素

问题:


它与iframe一起工作,但如果我调用ajax,它就不工作了。有什么要说的吗?

我不喜欢jsonp,它会在数据和表示之间产生耦合,所以我以前研究过这个问题,有一个技巧可以使用,如下所示:

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

A由sub1.example.com提供

B由sub2.example.com提供

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

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);
}

这听起来像是一个bug或漏洞。你在哪些浏览器中测试过这个?它在IE、Chrome中工作。我没有在Firefox中进行测试,我不确定是否有
window.location.host
,但是更改
document.domain
会允许同一父域上的两个不同子域进行通信。我也会试试。但我只是通过改变域来尝试ajax,但之前它对我不起作用。但我会试试这种方法。Iframe在子域调用的情况下工作良好。您可以在这里找到解决方案:您必须首先进行ajax调用,然后才能更改域,否则,由于您在发出ajax请求之前更改了域,因此由于安全策略,请求将失败。如果我理解您的解决方案,那么它与jsonp完全相同,但有一个限制,即iframe源只能从同一个主机提供服务。