jQuery $ .ajax完成回调未触发

时间:2013-12-15 17:22:22

标签: 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: "/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,则会触发完成。但是,在chrome控制台中我可以看到200 OK响应,但jquery似乎触发了失败处理程序。

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

6 个答案:

答案 0 :(得分:31)

您需要删除:

dataType: "json"

答案 1 :(得分:20)

有很多建议需要删除

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

答案 2 :(得分:6)

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

无论原因是什么,一个值得关注的好地方是数据'传递给回调的参数:

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

其内容将让您了解错误。

答案 3 :(得分:2)

需要从dataType中删除:“json”,

 dataType: "json"

答案 4 :(得分:0)

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

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

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

  3. 这是我为你的剧本思考的问题。

    .serializeArray()

答案 5 :(得分:0)

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