Ajax.请求在IE8/9中不能与CORS一起工作,静默失败
Ajax.Request doesn't work with CORS in IE8/9, fails silently
我有一个关于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对同域请求的行为是什么
相关文章:
- 转义符不能与innerHTML一起使用
- CORS-重定向到第二个GET正在接收的页面
- 高亮显示与数组字符串一起使用时文本插件中断
- setTimeout可以与闭包内的函数一起使用吗
- 将依赖外部库的UMD模块与browserfy捆绑在一起
- Highcharts colorsByPoint与系列中的线性渐变一起使用时不起作用
- node.js请求数据事件未在CORS ajax调用中触发
- 带有凭据的角度文件上载(CORS)不起作用
- 与域在同一台计算机上运行的NODEJS服务器的CORS错误
- 如何将js库与typescript一起使用
- SmartGWT数据源和CORS
- 将webpack和babel与父项目目录中的文件一起使用
- CORS-服务器端cookie没有保存在chrome浏览器上
- 将 Drag&Drop 与 jsTree 和 DataTables 一起使用
- Javascript-如何让脚本与Ajax请求的数据一起运行
- CORS 请求与 Safari 一起工作
- 无法使CORS与Slim API一起工作
- 将CORS与AWS API网关一起使用会带来哪些安全影响
- 让 CORS 与 JQuery 客户端、节点/快速服务器一起工作时出现问题
- Ajax.请求在IE8/9中不能与CORS一起工作,静默失败