有没有一种方法可以检索从iframe发送的ajax响应?

5
我想知道是否有办法从iframe中检索发送的ajax请求的响应。iframe执行以下操作:
1. iframe中的脚本发送ajax请求 2. iframe获得响应,并在iframe内更新内容
我想做的是在iframe之外拦截该请求,并使用该信息更新页面。如果您进入Chrome的开发工具,并转到网络选项卡,您可以看到iframe发出的请求/响应。如果有一个窗口事件或类似的东西,每次页面上收到响应时都会触发,那将非常好。
注意:iframe是不在同一域中的页面。

跨域是问题所在,而不是将响应放置到非iframe文档中的位置。AJAX调用发生在另一个域上?您是否也有在该域上编写脚本的能力? - DevlshOne
跨域 = 不会发生。 - epascarello
3个回答

6
如果子级iframe与父级在不同的域中,则您无法真正执行跨浏览器工作的任何操作。 请参见下面jasonjifly的答案,以了解在某些浏览器上可以工作的技术(假设您对两个框架的客户端脚本都有控制权)。
如果父级和子级位于同一域中,则可以实现您要查找的内容。
例如,假设您正在使用jquery,则可以在您的iframe中具有以下代码:
$.ajax(function() {
   .....
   complete: function() {
       window.parent.onAjaxComplete('Hi there');
   }
});

在父框架中加入以下代码:
function onAjaxComplete(msg)
{
    alert(msg);
}

为了在跨域场景下实现类似的结果,您可以让父框架轮询服务器。当服务器从子iframe接收到ajax请求时,它可以通过轮询服务向父页面发出提醒。显然,只有当您可以控制子iframe调用的服务时才适用于此方法。

所以我猜如果我没有控制iframe(我没有),那么我能做的事情不多? - kennypu
1
@kennypu 不,你不能做任何事情,那是保护我的电子邮件不被读取的安全措施 :) - epascarello

4
在理论上,由于同源策略,两个跨域iframe之间的通信是被禁止的。请参考这个页面:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Same_origin_policy_for_JavaScript 在HTML5之前,我们有一些解决方法:
  1. 如果您只想使用iframe获取跨域数据,可以使用JQuery:JSONP。本质上是使用". "允许执行跨域javascript代码。
  2. 另一种方法是“一个iframe中嵌套一个iframe”,请参考这个页面:http://blog.cakemail.com/the-iframe-cross-domain-policy-problem/
HTML5:
  1. window.postMessage,请参考这个页面:https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage
  2. HTML5 CORS,您需要配置服务器,请参考这个页面:http://www.html5rocks.com/en/tutorials/cors/
我的建议是使用解决方案1,它可以在几乎所有主流浏览器上工作。

0
(function() {
    var origOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function() {
        this.addEventListener('load', function() {
            var json = $.parseJSON(this.responseText);


        });
        origOpen.apply(this, arguments);
    };
})();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接