Вы правильно назвали название здесь. Опыт довольно противоречивый. Давайте пройдемся по нему ...
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 требует , чтобы все дескрипторы получили метод. Это означает, что для таких дескрипторов, как onerror, onload, ontimeout и onprogress, нужно что-то делать. Без определения метода для этих дескрипторов вы получите сетевой ответ «операция прервана».
В IE7 / 8/9 -> XDomainRequest по умолчанию имеет значение ASYNC. Он будет выполнять код дальше вниз по стеку независимо от того, завершается объект 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 довольно «свободны» в том, что они не прерываются, когда отсутствует метод для дескрипторов.