Ajax.请求在IE8/9中不能与CORS一起工作,静默失败

Ajax.Request doesn't work with CORS in IE8/9, fails silently

本文关键字:一起 CORS 工作 失败 静默 不能 请求 IE8 Ajax      更新时间:2023-09-26

我有一个关于Prototype在IE浏览器中处理CORS的问题<10. 我注意到对Ajax的调用。在IE9中,对跨源URL的请求会无声地失败,检查服务器的访问日志,很明显这个请求甚至从来没有发出过。

经过一些阅读,似乎IE8/9必须使用自己的XDomainRequest对象才能启用CORS,然而,原型的Ajax.getTransport函数返回XMLHttpRequest对象,我理解不允许在IE8/9中的CORS ?

我已经找到了一个针对相同问题的jQuery补丁,这告诉我这也可能是Prototype的问题,我只是找不到任何关于它的帖子。

我已经实现了一个hack的修复:

if (window.XDomainRequest) {
    // Use Microsoft XDR for IE8 and IE9
    var xdr = new XDomainRequest();
    xdr.open('POST', url);
    xdr.onload = function () {
        var data = xdr.responseText.evalJSON();
        callback_handler(data.domain);
    };
    setTimeout(function(){
        xdr.send();
    }, 0);
} else {
    new Ajax.Request(url,
        {
            method: 'post',
            onSuccess: function(response)
            {
                var data = response.responseText.evalJSON();
                callback_handler(data.domain);
            }
        }
    );
};

…但我想知道是否有人(或Prototype本身)有更好的解决方案?

基于Ajax。getTransport方法的来源:

var Ajax = {
  getTransport: function() {
    return Try.these(
      function() {return new XMLHttpRequest()},
      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
      function() {return new ActiveXObject('Microsoft.XMLHTTP')}
    ) || false;
  }
}

您可以看到getTransport将尝试返回列出的每个传输的新实例。所以,你可以实现一个polyfill,预先添加XDomainRequest

var _getTransport = Ajax.getTransport;
Ajax.getTransport = function() {
    return Try.these(
        function() { return new XDomainRequest() },
        _getTransport
    ) || false;
};

如果您在包含原型和首先使用Ajax之间插入此代码。请求时,它应该尽可能无缝地使用XDR。

注意:这是完全未经测试的,几乎可以肯定有一些边缘情况-我不确定XDR对同域请求的行为是什么