32

我有一个非常简单的 jQuery Ajax 调用(如下)。Ajax 调用执行,我可以在 Firebug Net 面板中看到服务器返回 200 OK 并返回字符串“OK”。但是,done 和 fail 函数不会触发!非常令人沮丧!

(“之前”和“之后”警报会触发。)

为简单起见(并且作为一种调试技术),我已将其剥离为最简单的骨架,但处理程序仍然不会触发。我在这里没有看到什么?

postUrl= "/mod/users/check_email/";
dataToPost= { email: "test@not.me" };

alert("before");
$.ajax
({
    type: "POST", 
    url: postUrl,
    data: dataToPost,
    done: function() 
    {
        alert("Success.");
    },
    fail: function() 
    {
        alert("Sorry. Server unavailable. ");
    },
});  // end Ajax call 

alert("after");
4

5 回答 5

55

您需要链接done()andfail()函数,它们不是用于的选项对象的一部分$.ajax

$.ajax({
    type: "POST", 
    url : postUrl,
    data: dataToPost
}).done(function()  {
    alert("Success.");
}).fail(function()  {
    alert("Sorry. Server unavailable. ");
}); 

此外,由于 ajax 是异步的,如果“之后”警报出现在“成功”警报之前,请不要感到惊讶。

于 2013-05-24T21:46:45.717 回答
15

success并且error可以以这种方式使用回调。对于donefail,您需要执行以下操作:

$.ajax({
    type: "POST", 
    url: postUrl,
    data: dataToPost,
}).done(function() {
    alert("Success.");
}).fail(function() {
    alert("Sorry. Server unavailable. ");
});

或者 :

$.ajax({
    type: "POST", 
    url: postUrl,
    data: dataToPost,
    success: function() {
            //code here
    }
});
于 2013-05-24T21:48:30.727 回答
13

您还需要设置dataType: 'json'. 当我将它设置为'string'并且它不会触发该done方法时,我遇到了这个问题。

于 2015-09-15T08:13:59.867 回答
12

我有这样的相同设置:

$.ajax({
    type: "POST", 
    url : postUrl,
    data: dataToPost
}).done(function()  {
    alert("Success.");
})

并遇到了同样的问题: done 函数不会触发。虽然我之前已经设法使用相同的设置使其工作了很多次,但我花了一段时间才弄清楚发生了什么。经过调整,我发现它还取决于 Ajax 调用返回的数据类型。最初,我将 ajax 调用配置为返回一些 HTML。done 功能不起作用。在我将它改回 json (在 Flask 中使用 jsonify)后,它又可以工作了。

于 2017-08-03T08:39:22.773 回答
2

async 如果请求应该同步发送,则设置为 false。默认为真。请注意,如果您将此选项设置为 false,您的请求将阻止其他代码的执行,直到收到响应为止。

dataType 您希望从服务器返回的数据类型。默认情况下,如果未指定 dataType,jQuery 将查看响应的 MIME 类型。

dataType: 'json'如果存在则删除。

async:false如果不存在则添加。

像这样执行:

var username=$("#username").val();
var password=$("#password").val();
$.ajax({
    url: "addperson.php",
    type: "POST", 
    async: false,
    data: {
        username: username,
        password: password
    }
})
.done (function(data, textStatus, jqXHR) { 
   var obj = JSON.parse(data);
   //Handle the response data here
    alert(obj.success); 
})
.fail (function(jqXHR, textStatus, errorThrown) { 
    alert("Error"); 
})
.always (function(jqXHROrData, textStatus, jqXHROrErrorThrown) { 
    alert("complete"); 
});

JSON 格式的 addperson.php 回显如下:

$username1 = isset($_POST["username"]) ? $_POST["username"] : '';
    
$password1 = isset($_POST["password"]) ? $_POST["password"] : '';

$servername = "xxxxx";
$username = "xxxxx";
$password = "xxxxx";
$dbname = "xxxxx";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$sql = "INSERT INTO user (username, password)
VALUES ('$username1', '$password1' )";

    ;  
    
    
   

if ($conn->query($sql) === TRUE) {
    
   echo json_encode(array('success' => 1));
} else{
    
    
  echo json_encode(array('success' => 0));
}





$conn->close();
于 2020-10-24T01:28:30.797 回答