我知道跨浏览器域调用的解决方案。要么使用JSONP,进行代理调用,要么接受服务器上的域。今天我在我的公司又发现了一种奇怪的方式。
方法:
他们使用以下命令更改主机以匹配第二台服务器的主机-
window.location.host = "xyz.com";
or
document.domain = "xyz.com";然后,他们创建一个隐藏的iframe,获取iframe中的内容,并将内容替换为可见元素。
问题:
它可以与iframe一起工作,但是如果我调用ajax,它就不能工作。有什么要说的吗?
发布于 2012-02-14 03:10:11
我不是jsonp的粉丝,它创建了数据和表示之间的耦合,所以我以前研究过这个问题,好吧,有一个技巧可以使用,请遵循以下内容:
假设我们有名为A的主窗口和名为B的iframe中的“子”窗口。A和B必须来自同一主机,但可以有不同的子域,如下所示:
sub1.example.com提供
A
B由sub2.example.com提供
浏览器将允许您更改文档的域,但仍会对您进行限制,因此您只能通过删除子域来更改域,直到到达主机为止,因此在A中,您可以更改域,如下所示:
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);
}https://stackoverflow.com/questions/9086331
复制相似问题