我正在从一个通过IE插件注入到每个页面的iframe中发出ajax请求。我使用IE的cross domain request是因为jQuery的ajax在IE上失败了。这在IE8 & 9上有75%的时间是有效的,另外25%的时间,xdr.onload甚至不会启动。
当onload触发和不触发时,服务器php正在执行的job...the日志看起来是一样的。而且,xdr.onerror也不会触发。
有什么想法吗?
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();发布于 2011-03-24 04:21:16
在最后一分钟发现了这个问题。在我的例子中,我需要指定一个超时值,即使请求没有超时。为了正确调试XDR问题,我建议使用以下代码,每个警告都会告诉您代码发生了什么。正如我所说的,在我的例子中,它是一个丢失的timeout声明。但是下面的代码应该可以调试任何XDR问题:
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');
}发布于 2011-07-15 03:52:36
我遇到了一个非常类似的问题:尽管XDomainRequests显示的所有请求和响应头都完全按照我的预期发送,但Fiddler只在某些时候失败。我在这些XDR对象上定义了每个事件处理程序和timeout属性,并且没有调用任何处理程序。F12开发人员工具显示请求已中止。GET和POST都可以中止到多个不同的域,但第一个请求总是成功工作。
然后,我尝试将对xdr.send的调用设置为超时,如下所示:
setTimeout(function () {
xdr.send();
}, 0);而且它起作用了。我不知道为什么,但也许这会对其他人有帮助。
发布于 2012-06-19 23:57:55
您在此处命名的标题是正确的。这种体验是相当不一致的。让我们走一遍。
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中)...
// 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相当“松散”,因为当句柄缺少方法时,它们不会中止。
https://stackoverflow.com/questions/5250256
复制相似问题