我有一个关于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对同域请求的行为是什么