【问题标题】:IE9 JQuery.ajax throws mystery errorIE9 JQuery.ajax 抛出神秘错误
【发布时间】:2012-01-24 19:51:34
【问题描述】:

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

编辑:看起来问题可能与被视为跨域的同域请求有关,但不清楚原因(参见 cmets)。

我正在使用本地代理发出跨域 ajax 请求,我使用的 url 看起来像 http://localhost/proxy/?target=..... 所有好的浏览器都对此感到满意,但 IE 甚至在请求被分派之前立即返回错误(我有使用 Fiddler 和 IE 的开发者工具网络捕获验证了这一点)。

当我检查传递给 JQuery 的 ajax.error 回调的错误对象时,它的 isRejected() 函数返回 true,但我无法找出导致请求被拒绝的原因。错误对象的readyState为4(表示请求完成?),status为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 目标 URL 已正确编码(这也告诉我 that.proxyRequired(settings.url)返回真)。

非常感谢任何输入。

【问题讨论】:

  • 使用未最小化版本的 jquery 并单步调用。
  • @asawyer 我花了一段时间在 JQuery 中涉水,据我所知,firefox 和 IE 都认为我的请求是跨域的 (??) 但 IE 为 @987654327 返回 false @ Firefox 返回 true 的地方,这是他们分歧的地方。如果这是问题,我不知道为什么任何一个浏览器都认为请求是跨域的,当我什至测试提供完整的代理 url(带域)并从目标 url 中剥离 'http://'

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


【解决方案1】:

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

JQuery.support.cors=true;

【讨论】:

    【解决方案2】:

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

    查看其他 Stackoverflow 问题:Cross-origin Ajax requests don't work in Opera and IE9?

    【讨论】:

    • 好建议,但不,代理没有重定向 - 正如我上面所说,请求甚至永远不会离开 IE。
    【解决方案3】:

    正如您在我的问题代码中看到的,我在 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;
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-05
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2017-04-20
      • 2014-06-07
      相关资源
      最近更新 更多