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