4

我有一个关于 Prototype 在 IE 浏览器 < 10 时处理 CORS 的问题。我注意到在 IE9 中对跨源 URL 的 Ajax.Request 调用会静默失败,检查服务器的访问日志很明显,该请求甚至从来没有制成。

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

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

我已经实现了一些 hacky 修复:

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);
            }
        }
    );
};

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

4

1 回答 1

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

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

如果您在包含原型和首先使用 Ajax.Request 之间的某个位置插入此代码,它应该尽可能无缝地使用 XDR。

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

于 2014-06-19T09:15:10.423 回答