Javascript 如何使用jQuery在JSON ajax请求中回调404上的函数?

Javascript 如何使用jQuery在JSON ajax请求中回调404上的函数?,javascript,ajax,jquery,http-status-code-404,Javascript,Ajax,Jquery,Http Status Code 404,我想用JSON发出一个Ajax请求和响应。所以我提出了这个Ajax请求: $.ajax({ url: 'http://my_url', dataType: "json", success: function(data){ alert('success'); }, error: function(data){ alert('error'); }, complete: function(data) { ale

我想用JSON发出一个Ajax请求和响应。所以我提出了这个Ajax请求:

$.ajax({
    url: 'http://my_url',
    dataType: "json",
    success: function(data){
      alert('success');
    },
    error: function(data){
      alert('error');
    },
    complete: function(data) {
      alert('complete')
    }})
这段代码运行良好,但当我的url向我发送HTTP代码404时,不会使用回调,甚至不会使用完整的回调。 经过研究,这是因为我的数据类型是“json”,所以404返回是HTML,json解析失败。所以没有回调

您是否有一个解决方案,可以在引发404时调用回调函数


编辑:完全回调不调用是返回是404。如果你想要一个404的URL,你可以调用:我的问题出在这个URL上。

这仅仅是因为
数据类型设置为“json”吗?如果是这样,请尝试将其更改为
text
,然后自己评估JSON:

$.ajax({
    url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697',
    dataType: "json",
    success: function(data) {
        alert('success');
    },
    error: function(data) {
        alert('error');
    },
    complete: function(xhr, data) {
        if (xhr.status != 0)
             alert('success');
        else
             alert('fail');
    }
})
$.ajax({
    url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697',
    dataType: 'text',
    success: function(data, status, xmlHttp) {
        try {
            data = eval('(' + data + ')');
            alert('success');
        } catch (e) {
            alert('json parse error');
        }
    },
    error: function(xmlHttp, status, error) {
        alert('error');
    },
    complete: function(xmlHttp, status) {
        alert('complete');
    }
});

jQuery使用您的配置来传输数据。这是通过动态插入脚本元素并将URL设置为指定值来实现的。然后,服务器返回的数据被评估为JavaScript——通常调用提供的回调。如果服务器返回404,则内容显然不是JavaScript,并且从不调用回调。有些浏览器支持脚本标记上的错误处理程序,在这些情况下会调用这些错误处理程序。不幸的是,IE不支持这一点。检测错误的最佳方法是依赖超时

在您的情况下,您应该指定一个额外的
timeout
选项,如果没有及时调用回调(404响应就是这种情况),则会导致调用错误处理程序


您不认为问题不在于数据类型,而在于不允许您进行的跨域请求吗

当您从同一域请求数据时,以下代码按预期工作,而当您进行跨域请求时,以下代码不起作用:

function handle404(xhr){
    alert('404 not found');
}

function handleError(xhr, status, exc) {
     // 0 for cross-domain requests in FF and security exception in IE 
    alert(xhr.status);
    switch (xhr.status) {
        case 404:
            handle404(xhr);
            break;
    }
}

function dumbRequest() {
    var url = 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697';
    url = 'http://twitter.com/';    
    url = '/mydata.json';    
//    url = 'mydata.json';    
    $.ajax(
        {url: url,
         dataType: 'json',
         error: handleError}
    );
}

您是否知道,即使HTTP状态为404,实际的主体仍然是有效的JSON?例如,具有以下JSON:

jsonp12692278524295({“请求”:“/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp12692278524295&=1269278536697”,“错误”:“未找到”})

因此,您应该检查您的数据在正常回调函数中是否具有
error
属性

更新:显然,即使页面的实际内容是有效的JSON,浏览器(我在Firefox中检查过)也没有执行它,很可能是因为它是404。由于jQuery必须添加
脚本
元素(由于跨域问题),因此它的JSONP包装器永远不会被调用,因此回调也不会被调用


因此,简而言之,如果不手动添加脚本元素并检查您的预定义回调函数是否在之后被调用,我认为没有办法解决这个问题。

以下是我的处理方法。在尝试使用返回的数据之前,我会检查它是否有错误。下面显示的只是一个示例,您可以对其进行扩展,使其更符合您的需求。这还考虑了会话超时和其他场景

我的第一个电话:

  $.ajax({ type: 'POST', 
    url: '../doSomething',
    data: 'my data',
    success: function(data) {
      if (HasErrors(data)) return;
      var info = eval('(' + data + ')');
      // do what you want with the info object
    },
    error: function(xmlHttpRequest) {
      ReportFailure(xmlHttpRequest);
    }
  });
和两个助手函数:

function HasErrors(data) {
  if (data.search(/login\.aspx/i) != -1) {
    // timed out and being redirected to login page!
    top.location.href = '../login.aspx';
    return true;
  }
  if (data.search(/Internal Server Error/) != -1) {
    ShowStatusFailed('Server Error.');
    return true;
  }
  if (data.search(/Error.aspx/) != -1) {
    // being redirected to site error reporting page...
    ShowStatusFailed('Server Error. Please try again.');
    return true;
  }
  return false;
}

功能报告失败(msg){
var文本;
如果(消息类型=='string'){
text=msg;
}
else if(typeof msg.statusText=='string'){
如果(msg.status==200){
text=msg.responseText;
}
否则{
text='('+msg.status+')+msg.statusText+':';
//如果可能,请使用错误响应中的标题
var matches=msg.responseText.match(/\(.*?)\/i);
如果(匹配!=null)
{text=text+匹配[1];}
其他的
{text=text+msg.responseText;}
}
}
//在页面中执行某些操作以显示“文本”错误消息
$(“#状态显示”)
.html(“”+文本)
.addClass(“状态错误”);
}

也遇到了同样的问题,saw提到支持捕获404错误,或者正如他们所描述的:“在网络故障或格式错误的JSON响应情况下进行错误恢复”

而且它工作得很好:)

以下是我通过JSONP获取YouTube视频详细信息的(简化)代码:

$.jsonp(
{
    url: "https://gdata.youtube.com/feeds/api/videos/ee925OTFBCA",
    callbackParameter: "callback",
    data: 
    {
        alt: "jsonc-in-script",
        v: "2"
    },
    success: function(json, textStatus) 
    { 
        console.log("WEEEEEEEE!"); 
    },
    error: function(xOptions, textStatus) 
    {
        console.error(arguments);
    }
});

以下解决方案对我很有效:)


如果您想在使用Javascript和jsonp访问Twitter API时处理错误,您需要在请求中包含参数
suppress\u response\u code
。这使得来自twitterapi的所有响应都响应为
200ok
响应,并包含一个错误。然后需要检查响应是否包含
错误
参数

$.ajax({
  url: "https://api.twitter.com/1/users/show.json",
  dataType: 'jsonp',
  jsonp: "callback",
  data: {
    screen_name: "simongate1337",
    suppress_response_codes: true // <- Important part
  },
  success: function(data) {
    if(data.error) {
      console.log("ERROR: "+data.error);
    } else {
      console.log("Success, got user " + data.screen_name);
    }
  }
});
$.ajax({
url:“https://api.twitter.com/1/users/show.json",
数据类型:“jsonp”,
jsonp:“回调”,
数据:{
屏幕名称:“simongate1337”,

抑制响应代码:true/使用
statusCode
-选项

$.ajax({
    url: 'http://my_url',
    dataType: "json",
    statusCode: {
        404: function() {
            alert("I could not find the information you requested.");
        }
    },
    success: function(data) {
      alert('success');
    },
    error: function(data) {
      alert('error');
    },
    complete: function(data) {
      alert('complete');
    }
})

你的意思是:“complete:function(status,text){”我也尝试过,但complete callback它不是call-too:(我用这个解决方案更新了我的问题,并做了更多解释。这是一样的。如果你只是在函数complete中发出警报,那就不是call。哈?这是给我的。我复制了你的代码,它工作了,我只是扩展来展示你将如何处理。使用Firebug并查看你的请求/响应。某处可能出现JS错误。我使用的是codeigniter,它只是ignor。)在调用所有回调时,web inspector显示404错误。这失败了,即使它的工作方式与URL类似,如果在URL中没有
callback=jsonp…
的情况下尝试它会怎么样?例如:超时未解决解决方案。通过后不调用任何内容:(这里也是一样,我的每次都会触发错误,尽管它得到了数据。我不确定这个答案到底在-1上做了什么。这是一个很好的解决实际问题的方法。很遗憾,这个库似乎已经停止了开发。对于现代版本的jQuery有类似的解决方案吗?
$.ajax({
    url: 'http://my_url',
    dataType: "json",
    success: function(data){
      alert('success');
    },
    error: function(data){
      alert('error');
    },complete: function(xhr, data) {
        if(data==="parsererror"){
             alert('404');
        }
    } 
});
$.ajax({
  url: "https://api.twitter.com/1/users/show.json",
  dataType: 'jsonp',
  jsonp: "callback",
  data: {
    screen_name: "simongate1337",
    suppress_response_codes: true // <- Important part
  },
  success: function(data) {
    if(data.error) {
      console.log("ERROR: "+data.error);
    } else {
      console.log("Success, got user " + data.screen_name);
    }
  }
});
$.ajax({
    url: 'http://my_url',
    dataType: "json",
    statusCode: {
        404: function() {
            alert("I could not find the information you requested.");
        }
    },
    success: function(data) {
      alert('success');
    },
    error: function(data) {
      alert('error');
    },
    complete: function(data) {
      alert('complete');
    }
})