【问题标题】:Jquery ajax not catching 404 [duplicate]Jquery ajax没有捕获404 [重复]
【发布时间】: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。我现在很尴尬

标签: jquery ajax laravel get


【解决方案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 问题,那么投票关闭作为副本会更合适。然而,这没有实际意义,因为您的答案与问题完全无关
猜你喜欢
  • 2012-06-11
  • 2012-11-28
  • 2011-09-27
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2013-07-13
相关资源
最近更新 更多