首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XDomainRequest在IE 9上中止POST

XDomainRequest在IE 9上中止POST
EN

Stack Overflow用户
提问于 2013-04-03 20:09:42
回答 1查看 5.2K关注 0票数 5

我正在做一个跨域Ajax调用。

我的代码:

代码语言:javascript
复制
if (window.XDomainRequest) // Check whether the browser supports XDR.
{
    xdr = new XDomainRequest(); // Create a new XDR object.
    if (xdr) {
        xdr.timeout = 3000;//Set the timeout time to  3 second.
        xdr.onload = function () {
            alert("Success");
        };
        xdr.onerror = function () {
            alert("Error");
        };
        xdr.ontimeout = function () {
            alert("Error");
        };
        xdr.open("post", urlSearch);
        xdr.send();
    }
}
else {
    $.ajax({
        url: urlSearch,
        type: 'POST',
        dataType: 'json',
        timeout: 3000,
        success: function (data) {
            alert("Success");
        },
        error: function () {
            alert("Error");
        }
    });
}

上面的代码在所有浏览器中都工作得很好,但在IE中有时会显示错误,如(aborted)。

为了克服这个错误,我在谷歌中搜索,没有找到任何好的解决方案。

您可以看到显示(aborted)的错误消息。http://postimg.org/image/k01u6t9v5/

当我单独调用特定的URL时,它不会显示任何(已中止)消息(显示成功警告)。但当我进行多个调用时(如图所示),它会显示该类型的错误。

如何克服这个问题?

请帮帮忙

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-23 07:30:59

我不确定这是不是同样的问题,但在我的例子中,所有这些都需要设置: onerror;onprogress;ontimeout;和onload。以下是一些讨论该问题的参考资料:

  • http://social.msdn.microsoft.com/Forums/ie/en-US/30ef3add-767c-4436-b8a9-f1ca19b4812e/ie9-rtm-xdomainrequest-issued-requests-may-abort-if-all-event-handlers-not-specified
  • http://cypressnorth.com/programming/internet-explorer-aborting-ajax-requests-fixed/
  • http://rudovsky.blogspot.com/2012/09/microsoft-shit-xdomainrequest.html
  • https://github.com/faye/faye/pull/98

还有很多其他的。在他们建议的解决方案中,它们是分散的,有时是相互矛盾的。例如,有人建议将xdr.send调用包装在setTimeout中。

通过为每个事件处理函数添加非空体,我看到的行为消失了。我不确定是否所有这些都是必要的。setTimeout包装器绝对不是必需的。

一条可能不相关的信息:在我的例子中,我决定将每个处理程序绑定到'this‘对象。我还添加了函数实现,以防止我的编译器将它们都赋值给同一个空函数。我的代码是使用GET,而不是POST。YMMV.

您的代码留下了一个未设置的处理程序:

代码语言:javascript
复制
if (window.XDomainRequest) // Check whether the browser supports XDR.
{
    xdr = new XDomainRequest(); // Create a new XDR object.
    if (xdr) {
        xdr.timeout = 3000;//Set the timeout time to  3 second.
        xdr.onload = function () {
            alert("Success");
        };
        xdr.onerror = function () {
            alert("Error");
        };
        xdr.ontimeout = function () {
            alert("Error");
        };
        // this also needs to be set
        xdr.onprogress = function() {
            window.console.log('progress');
        };
        xdr.open("post", urlSearch);
        xdr.send();
    }
}
else {
    $.ajax({
        url: urlSearch,
        type: 'POST',
        dataType: 'json',
        timeout: 3000,
        success: function (data) {
            alert("Success");
        },
        error: function () {
            alert("Error");
        }
    });
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15786966

复制
相关文章

相似问题

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