首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自IE的ajax (XDR)响应不一致

来自IE的ajax (XDR)响应不一致
EN

Stack Overflow用户
提问于 2011-03-10 02:13:04
回答 5查看 8.4K关注 0票数 6

我正在从一个通过IE插件注入到每个页面的iframe中发出ajax请求。我使用IE的cross domain request是因为jQuery的ajax在IE上失败了。这在IE8 & 9上有75%的时间是有效的,另外25%的时间,xdr.onload甚至不会启动。

onload触发和不触发时,服务器php正在执行的job...the日志看起来是一样的。而且,xdr.onerror也不会触发。

有什么想法吗?

代码语言:javascript
复制
        thisURL = "http://example.com/getmsg.php?cmd=getMessage&iid=ddeb2c1228&uurl=http%3A%2F%2Fwww.cnn.com%2F&t=" + Math.random(); 

        // Use Microsoft XDR
        var xdr = new XDomainRequest();
        xdr.open("GET", thisURL);
        xdr.onload = function() {
            // this is sometimes called, sometimes not in IE
            alert('INCONSISTENT ALERT');
            callback(xdr.responseText);
        };
        xdr.send();
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-24 04:21:16

在最后一分钟发现了这个问题。在我的例子中,我需要指定一个超时值,即使请求没有超时。为了正确调试XDR问题,我建议使用以下代码,每个警告都会告诉您代码发生了什么。正如我所说的,在我的例子中,它是一个丢失的timeout声明。但是下面的代码应该可以调试任何XDR问题:

代码语言:javascript
复制
       var xdr = new XDomainRequest();
            if (xdr) {
                xdr.onerror = function () {
//                    alert('xdr onerror');
                };
                xdr.ontimeout = function () {
//                    alert('xdr ontimeout');
                };
                xdr.onprogress = function () {
//                    alert("XDR onprogress");
//                    alert("Got: " + xdr.responseText);
                };
                xdr.onload = function() {
//                    alert('onload' + xdr.responseText);
                    callback(xdr.responseText);
                };
                xdr.timeout = 5000;
                xdr.open("get", thisURL);
                xdr.send();
            } else {
//                alert('failed to create xdr');
            }
票数 4
EN

Stack Overflow用户

发布于 2011-07-15 03:52:36

我遇到了一个非常类似的问题:尽管XDomainRequests显示的所有请求和响应头都完全按照我的预期发送,但Fiddler只在某些时候失败。我在这些XDR对象上定义了每个事件处理程序和timeout属性,并且没有调用任何处理程序。F12开发人员工具显示请求已中止。GET和POST都可以中止到多个不同的域,但第一个请求总是成功工作。

然后,我尝试将对xdr.send的调用设置为超时,如下所示:

代码语言:javascript
复制
setTimeout(function () {
    xdr.send();
}, 0);

而且它起作用了。我不知道为什么,但也许这会对其他人有帮助。

票数 9
EN

Stack Overflow用户

发布于 2012-06-19 23:57:55

您在此处命名的标题是正确的。这种体验是相当不一致的。让我们走一遍。

代码语言:javascript
复制
var xdr, err, res, foo, url;

xdr = new XDomainRequest();

err = function(){ alert("There was an error, operation aborted"); }
res = function(){ alert("Success! " + xdr.responseText); }
foo = function(){ return; }

url = "http://hello.com/here/is/the/url/?query=true&whatever=asd";

xdr.onerror = err;
xdr.ontimeout = foo;
xdr.onprogress = foo;
xdr.onload = res;
xdr.timeout = 5000;

xdr.open("get", url);
xdr.send(null);

XDomainRequest对象在每个IE中的处理方式都不同。

在IE9 ->中,XDomainRequest object 要求为所有句柄提供一个方法。这意味着,像onerror、onload、ontimeout和onprogress这样的处理都被赋予了一些事情要做。如果没有为这些句柄定义一个方法,那么你将得到一个“操作中止”的网络响应。

在IE7/8/9 ->中,默认情况下XDomainRequest是异步的。无论xdr对象是否完成,它都会在堆栈的下方执行代码。放置一个setTimeout可能是一个解决方案,但不应该是。

在这种情况下,请在执行任何进一步的代码之前触发一个事件并侦听该事件。例如(在jquery中)...

代码语言:javascript
复制
// call this method in xdr onload
$(document).trigger("xdr_complete");

// use this wrapper in code you want to execute after the complete of xdr
$(document).bind("xdr_complete", function(){ ... });

在IE7/IE8中,你会注意到它在工作。IE7和IE8相当“松散”,因为当句柄缺少方法时,它们不会中止。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5250256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档