Javascript jQuery$.ajax已完成回调未触发

Javascript jQuery$.ajax已完成回调未触发,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有以下代码: $("#loginSubmitButton").on("click",function(){ var loginUserDetails = { email: $("#email").val(), password: $("#password").val() }; //Send the AJAX request to authenticate the user $.ajax({ type: "POST", url: "/somewe

我有以下代码:

$("#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文档(除非我理解不正确),如果我从我的web服务器收到200 OK,我希望会触发done。然而,在chrome控制台中,我可以看到200OK响应,但jquery似乎触发了失败处理程序


有人知道我可能做错了什么吗

需要从数据类型中删除:“json”


有几件事应该能解决你的问题,还有几点提示

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

  • $的
    data
    选项。ajax
    不需要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”

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

    不管是什么原因,最好看一下传递给回调的“data”参数:

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

    它的内容会让你了解问题所在。

    有很多建议要删除

    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文件BOMs)的问题。一旦我删除了这些,它修复了问题,同时还保留了

    dataType: json
    

    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));
       }
    

    检查faily
    数据类型中的错误消息:“json”
    您不需要stringify loginUserDetails…在此处检查我的答案:在此处检查我的答案:删除了逗号,但仍然存在相同的问题。如何检查失败中的错误消息?有什么原因不应该侦听单击事件吗?我的web服务需要一个带有JSON参数的帖子,所以我使用了JSON.Stringify。这是一个问题吗?您可以不单击提交表单,也可以不单击“单击”按钮提交表单。在某些情况下,浏览器可能会掩盖这些问题,但我不会依赖它。太棒了!删除
    数据类型
    只是一种变通方法。修复数据源才是真正的修复。我认为我的问题在于服务器返回的是
    text/html
    ,而不是JSON响应。这才是真正的答案。在我的例子中,我有一个返回
    INF
    (我甚至不知道这个常量存在)的等式,它导致了一个json解析错误。我以前应该看到过这一点,我从我自己的网站上重新制作了一个部分,问题是如果你不返回json数据类型,jquery会将其视为失败。谢谢。Add async:false
     $.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));
       }