Ajax.Request在IE8 / 9中不能与CORS一起使用,无声地失败

时间:2014-03-27 10:41:42

标签: javascript xmlhttprequest internet-explorer-9 prototypejs xdomainrequest

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

经过一些阅读后,似乎IE8 / 9必须使用自己的XDomainRequest对象才能启用CORS,但是Prototype的Ajax.getTransport函数返回{I}}对象,据我所知不允许IE8 / 9中的CORS?

I have found a patch for jQuery对于同一个问题,它告诉我这可能也是Prototype的一个问题,我找不到任何关于它的帖子。

我实施了一些hacky修复:

XMLHttpRequest

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

1 个答案:

答案 0 :(得分:0)

基于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将尝试返回每个列出的传输的新实例。因此,您可以预先实现添加XDomainRequest的填充。

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

如果您在包含prototype之间插入此代码,并且首先使用Ajax.Request,它应尽可能无缝地使用XDR。

N.B。这是完全未经测试的,几乎肯定有一些边缘情况 - 我不确定XDR的行为是针对同域请求的。