【问题标题】:jQuery $.ajax done callback not firingjQuery $.ajax 完成回调未触发
【发布时间】:2020-10-24 10:12:59
【问题描述】:

我有以下代码:

$("#loginSubmitButton").on("click",function(){
  var loginUserDetails = {
    email: $("#email").val(),
    password: $("#password").val()
  };

  //Send the AJAX request to authenticate the user
  $.ajax({
    type: "POST",
    url: "/somewebservice/v1/users/authenticate",
    data: JSON.stringify(loginUserDetails),
    contentType: "application/json;charset=UTF-8",
    dataType: "json",
  }).done(function() {
      $("#loginResult").text("Login successful");
    })
    .fail(function() {
      $("#loginResult").text("Login failed");
    });

});

根据 jquery 文档(除非我的理解有误),如果我从我的网络服务器收到 200 OK,我预计会触发完成。但是,在 chrome 控制台中,我可以看到 200 OK 响应,但 jquery 似乎触发了失败处理程序。

有人知道我在这里做错了什么吗?

【问题讨论】:

标签: javascript jquery ajax


【解决方案1】:

你需要删除:

dataType: "json"

【讨论】:

  • 我以前应该看过这个,我从我拥有的网站上重新制作了一部分,问题是如果你不返回 json 数据类型,jquery 会将其视为失败。谢谢。
  • 添加异步:false
【解决方案2】:

有很多建议要删除

dataType: "json"

虽然我承认这行得通,但它可能忽略了根本问题。这很可能是由解析器错误(浏览器解析 json 响应)引起的。首先检查 .always() 或 .fail() 中的 XHR 参数。

假设它是解析器失败,那为什么?也许返回字符串不是 JSON。或者它可能是响应开始时的错误空格。考虑在提琴手中查看它。我的看起来像这样:

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":".\/output\/ou...

在我的情况下,这是 PHP 喷出不需要的字符(在本例中为 UTF 文件 BOM)的问题。一旦我删除了这些,它就解决了问题,同时也保留了

dataType: json

【讨论】:

  • 太棒了!删除 dataType 只是一种解决方法。修复数据源才是真正的修复。
  • 不错。我认为我的问题是服务器返回 text/html 而不是 JSON 响应。
  • 真正的答案。在我的情况下,我有一个返回 INF 的方程(我什至不知道这个常量存在),这导致了 json 解析错误。
【解决方案3】:

如果您的服务器为 json 响应返回空字符串(即使是 200 OK),jQuery 会将其视为失败。从 v1.9 开始,空字符串被认为是无效的 json。

不管是什么原因,一个很好的地方是传递给回调的“数据”参数:

$.ajax( .. ).always(function(data) {
    console.log(JSON.stringify(data));
});

其内容将使您了解问题所在。

【讨论】:

    【解决方案4】:

    需要从 dataType: "json" 中删除 ,

     dataType: "json"
    

    【讨论】:

    • 删除了逗号但仍然是同样的问题。失败时如何查看错误信息?
    【解决方案5】:

    ajax URL 必须是同一个域。您不能使用 AJAX 访问跨域脚本。这是因为同源策略。
    添加“dataType:JSONP”实现跨域通信

    使用下面的代码

     $.ajax({
           URL: cross domain 
    
            dataType: 'jsonp'  
                // must use dataType:JSONP to achieve cross domain communication, otherwise done function would not called. 
               // jquery ajax will return "statustext error" at }).always(function(data){}
    
    
     }).always(function(data){
          alert(JSON.stringify(data));
       }
    

    【讨论】:

      【解决方案6】:

      应该解决您的问题的一些事情和一些一般提示。

      1. 不要监听提交按钮的点击。您应该等待表单上的提交事件。

      2. $.ajaxdata 选项不需要 JSON 字符串。它需要一个序列化的字符串或具有名称和值对象的数组。您可以使用.serialize().serializeArray() 轻松创建其中任何一个。

      这是我对你的剧本的想法。

      $('#form-with-loginSubmitButton').on('submit', function(e){
      
      
        e.preventDefault():
      
        var $form = $(this),
            data = $form.serializeArray();
      
        $.ajax({
          type: "POST",
          url: "/somewebservice/v1/users/authenticate",
          data: data
        }).done(function(result){
          console.log(result);
        });
      
      });
      

      【讨论】:

      • 我为什么不应该监听点击事件?我的网络服务需要一个带有 JSON 参数的 POST,所以我使用了 JSON.Stringify。有问题吗?
      • 您可以在不点击的情况下提交表单,或者在不点击的情况下“点击”按钮。在某些情况下,浏览器可能会掩盖这些问题,但我不会依赖它。
      猜你喜欢
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2013-03-20
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多