我知道跨浏览器域调用的解决方案。使用JSONP,进行代理调用或接受服务器上的域。我今天在我公司发现了一种更奇怪的方式。
方法:
他们正在使用这个 -
更改主机以匹配第二台服务器的主机window.location.host = "xyz.com";
or
document.domain = "xyz.com";
然后他们正在创建一个隐藏的iframe并在iframe中获取内容并将内容替换为可见元素。
问题:
它适用于iframe,但如果我执行ajax调用,则无效。对此有何评论?
答案 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);
}