IE9 JQuery.ajax引发了神秘错误

时间:2011-12-20 21:47:58

标签: javascript jquery ajax cross-domain internet-explorer-9

我在IE9中遇到了一个困难的ajax错误。我会在前面说这在技术上不是跨域请求,所以我确定这不是问题。

修改:问题可能与被视为跨域的同域请求有关,但不清楚原因(请参阅注释)。

我正在使用本地代理来制作跨域ajax请求,我使用的网址看起来像http://localhost/proxy/?target=.....所有好的浏览器都对此感到满意,但IE会在发送请求之前立即返回错误(我已经使用Fiddler和IE的开发人员工具网络捕获验证了这一点。

当我检查传递给JQuery的ajax.error回调的错误对象时,它的isRejected()函数返回true,但我找不到会导致请求被拒绝的内容。错误对象的readyState是4(暗示请求已完成?),状态为0,statusText为“error”。

我正在建立我的请求:

$.ajax(url, {
    data: {...list of parameters...},
    dataType: 'json',
    type: 'GET',
    success: function() { ... },
    error: function() { ... },
    beforeSend: proxy.beforeRequestSend,
    timeout: 35000
});

proxy.beforeRequestSend函数如下所示:

this.beforeRequestSend = function(XHR, settings) {

  if(that.proxyRequired(settings.url)) {
    // I've also tried using the full url (http://localhost/proxy/?...)
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url); 
  }
};

有谁知道会导致请求在IE9中彻底失败的原因是什么?不幸的是,我无法访问IE8或7进行测试,但我认为它们的行为相同。调用JQuery的ajax错误处理程序这一事实表明,在构建请求时,错误并未发生,但是当它被执行时。所有其他浏览器正常工作告诉我基础是正确的。

我之前已经读过JQuery / IE组合有问题对某些字符进行url编码,但是如果我在beforeSend函数的末尾警告settings.url,则目标网址被正确编码(这也告诉我{ {1}}返回true)。

任何输入都非常赞赏。

3 个答案:

答案 0 :(得分:3)

在你的javascript中,在调用$ .ajax(或等效的)强制跨域行为之前:

JQuery.support.cors=true;

答案 1 :(得分:1)

您的代理操作是否发送重定向以响应ajax调用?浏览器默默地遵循重定向,这可能是XHR检测XSS尝试的原因。由于jQuery在IE9上不支持CORS,因此您将收到错误。

请参阅此其他Stackoverflow问题:Cross-origin Ajax requests don't work in Opera and IE9?

答案 2 :(得分:1)

正如您在我的问题代码中所看到的,我在JQuery.ajax函数的beforeSend回调(proxy.beforeRequestSend)中预先设置了代理URL。到执行此函数时,JQuery已经检查了请求并确定它是跨域的。

因此,JQuery将我的所有请求视为跨域,即使它们都转到了本地代理。然后JQuery拒绝IE和Opera中的任何跨域请求,因为它们不支持CORS。

幸运的是,crossDomain属性被传递给settings对象中的beforeSend回调,并且很容易被更改。

this.beforeRequestSend = function(XHR, settings) {

  if(that.proxyRequired(settings.url)) {
    settings.url = 'proxy/?target=' + encodeURIComponent(settings.url);
    settings.crossDomain = false;
  }
};