【问题标题】:Why won't jQuery call my Ajax error handler?为什么 jQuery 不调用我的 Ajax 错误处理程序?
【发布时间】:2011-05-23 09:18:21
【问题描述】:

我有以下 jQuery Ajax 调用(没有其他全局设置/处理程序):

$.ajax( { 
   url: "http://www.blah.com/url/does/not/exist", 
   type: "get",
   data: someData,
   dataType: "json",
   error: function (xhr, msg, ex)
   {
       alert("Failed: " + msg);
   },
   complete: function (xhr, msg)
   {
       alert("Done: " + msg);
   }

我希望我的错误处理程序被调用,但是complete 事件触发并且警报显示Done: success。在我的 Javascript 控制台中,我看到以下消息:

XMLHttpRequest cannot load http://www.blah.com/url/does/not/exist. 
Origin null is not allowed by Access-Control-Allow-Origin.
  1. 为什么不调用我的错误处理程序?
  2. 记录到控制台的Origin消息是什么意思?

谢谢!

【问题讨论】:

    标签: ajax jquery error-handling


    【解决方案1】:

    您的错误处理程序没有被调用,因为 AJAX 请求甚至没有发生:浏览器拒绝这样做,因为 same origin policy:您请求的数据将来自与服务不同的站点你的页面。

    您可以尝试使用JSONP 数据类型来解决该问题:

    $.ajax({ 
        url: "http://www.blah.com/url/does/not/exist", 
        type: "get",
        data: someData,
        dataType: "jsonp",
        error: function(xhr, msg, ex) {
            alert("Failed: " + msg);
        },
        complete: function(xhr, msg) {
           alert("Done: " + msg);
        }
    });
    

    【讨论】:

    • 我高兴得太早了...现在successerror 都没有被调用,控制台显示:Failed to load resource -- 有什么想法吗?
    • 好吧,Failed to load resource 是您的 404 错误。这意味着错误处理程序仅在 Web 服务器实际处理请求时才被调用。换句话说,它只会在5xx错误时调用,而不是4xx错误,因此如果页面不存在则不会调用它。
    • 好的,谢谢。我想知道如果它不能捕获所有错误,那么拥有一个错误处理程序有什么意义?我需要处理的最可能的错误是网络问题(无连接),它会产生 404...
    【解决方案2】:

    看起来唯一的方法是在我的success 方法中接收服务器响应并将其存储在一个全局变量中,我将在处理程序中检查complete(它总是被调用)。无响应表示请求失败。

    在这个原本出色的库中,这是一种处理错误的劣质方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2011-04-06
      • 2015-06-03
      • 2019-09-26
      • 2011-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多