Jquery ajax没有捕获404 [重复]

Posted

技术标签:

【中文标题】Jquery ajax没有捕获404 [重复]【英文标题】:Jquery ajax not catching 404 [duplicate] 【发布时间】:2018-08-30 07:51:40 【问题描述】:

我正在尝试使用 AJAX 填充我的下拉列表,并且我从控制器返回 404 错误消息,而 Ajax 没有捕捉到它...

我在控制器的回报是

return Response()->json(array('error' => '404 car type not found'), 404);

这是我的 JS

$('document').ready(function () 
$('#car_type').bind('changed.bs.select', function () 
    $.ajax(
        type: 'POST',
        url:'carclass/'+$('#car_type').val(),
        dataType: 'json',
        error: function(XMLHttpRequest, textStatus, errorThrown)
            alert('status:' + XMLHttpRequest.status + ', status text: ' + XMLHttpRequest.statusText);
        ,
        success: function( json ) 
           $.each(json, function(i, obj)
                $('#car_class').append($('<option>').text(obj.name).attr('value', obj.id));
           );
           $('#car_class').selectpicker('refresh');
        
);
 );
 );

它正在返回

GET http://localhost:8000/ads/cartype/2 404 (Not Found)

【问题讨论】:

那么问题似乎出在服务器端,而不是您的 JS。 为什么您的 ajax 正在向 carclass/... 发出 POST 请求,而您提到的返回是对 cartype/... 的 GET 请求? “没抓到” - 没抓到什么?它是否达到了error: 回调但您没有收到明确的消息?是不是发现它是 404 所以点击 'success:' 回调? 我很抱歉,我意识到这已经得到了回答,我将其标记为重复......似乎我的主要问题是#car_type,它应该是#car_brand。我现在很尴尬 【参考方案1】:

请改用fail()。您还可以使用done() 回调,它是success 的替代方法。

$.ajax( "example.php" )
  .done(function(data) 
    $.each(data.responseJSON, function(i, obj) 
            $('#car_class').append($('<option>').text(obj.name).attr('value', obj.id));
    );
    $('#car_class').selectpicker('refresh');
  )
  .fail(function(data) 
    alert('status:' + this.status + ', status text: ' + this.statusText);
  )
  .always(function() 
    alert( "complete" );
  );

【讨论】:

1. error 属性根本不被弃用。您添加到文档中的链接甚至显示了这一点。 2. $.ajax() 调用中没有 fail 属性。您的代码将不起作用。我想你打算改用fail() fail: 不是error: 的替代品,它是一种承诺的方法,所以$.ajax(..).fail(function() ... ) 我可以看到对 ".fail() 方法替换已弃用的 .error()" (来自链接的文档)的混淆。这意味着promise上的错误方法,而不是ajax调用中的错误callback 谢谢,我编辑了我的错误。 一个很好的编辑。但需要明确的是,error:.fail() 之间没有区别,只是您可以返回承诺并稍后添加.fail()。所以你重构了 OP 的代码,但没有修复它(除非你添加了一些文本中没有解释的东西)。【参考方案2】:

将您的 error 块替换为类似这样的内容,其中 xhr.status 将为您提供响应的状态代码。

error:function (xhr, ajaxOptions, thrownError)
    if(xhr.status==404) 
        alert('status:' + xhr.status + ', status text: ' + xhr.statusText);
    

【讨论】:

不确定谁复制了谁以及从哪个其他问题。此外,这并不能回答 OP 的要求。 我正在写答案。我不知道另一个答案。 @RoryMcCrossan 我指的是这个问题的另一个答案,它在您编辑之前具有几乎相同的描述,并且代码和布局完全相同。 也许是复制了@RoryMcCrossan。不知道 鉴于您发布了 8 秒后,您很可能都从同一个地方复制了代码。如果这是一个 SO 问题,那么投票关闭作为副本会更合适。然而,这没有实际意义,因为您的答案与问题完全无关

以上是关于Jquery ajax没有捕获404 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSONP 时如何捕获 jQuery $.getJSON(或数据类型设置为“jsonp”的 $.ajax)错误?

jQuery 修复“未捕获的 TypeError:$ 不是函数”错误 [重复]

哪些浏览器不支持带有 jQ​​uery.ajax 的 HTTP DELETE? [复制]

在纯javascript ajax中捕获跨域响应[重复]

Web API + jQuery AJAX DELETE 请求返回 404

尝试使用 JQuery 捕获日志失败和 404