我正在尝试在ajax中创建一个喜欢/不喜欢的按钮。ajax将我的数据发送到一个单独的文件,数据保存在数据库中,该文件发送回我从chrome网络响应窗口获得的成功响应{"status":"success","message":"Like has been saved.","data":{"like":"1"}}。但是,$ajax(...).done中的代码无法正常工作
我尽可能地使用了console.logged和var.dumped的所有代码。我的数据正在被发送到我的数据库,这应该意味着SQL和类似的类是正确的。我也尝试过简单地console.log响应"res“,并将其余的放在注释中,但这同样没有给我任何结果
<div>
<a href="#" data-id="<?php echo $post->id ?>" class="like">Like</a>
<a href="#" data-id="<?php echo $post->id ?>" class="dislike" style="display:none;">Dislike</a>
<span class='likes' data-id="<?php echo $post->id ?>"><?php echo $post->getLikes(); ?></span> people like this
</div>$("a.like, a.dislike").on("click",function(e){
var postId = $(this).data("id");
if($("a.like")){
var type = 1;
}else if($("a.dislike")){
var type = 0;
}
var elLikes = $(this).siblings(".likes");
var likes=elLikes.html();
$.ajax({
method: "POST",
url: "ajax/postlike.php",
data: {postId: postId, type:type},
dataType: "json",
})
.done(function( res ) {
console.log(res);
if(res.status=="succes"){
console.log(res);
if(res.data.like=="1"){
likes++;
elLikes=html(likes);
$("a.like").css("display","none");
$("a.dislike").css("display","inline-block");
} else if(res.data.like=="0"){
likes--;
elLikes=html(likes);
$("a.dislike").css("display","none");
$("a.like").css("display","inline-block");
}
}
});
e.preventDefault();
});if(!empty($_POST)){
try {
$postId=$_POST['postId'];
$type=htmlspecialchars($_POST['type']);
$userId=$_SESSION['user_id'];
$l = new Like();
$l->setPostId($postId);
$l->setUserId($userId);
$l->setType($type);
$l->save();
$res = [
"status" => "success",
"message" => "Like has been saved.",
"data" =>[
"like" => $type
]
];
}catch (trowable $t) {
$res = [
'status' => 'failed',
'message' => $t->getMessage()
];
}
echo json_encode($res);
var_dump($res);
}我所期望的是Ajax将JSON数据发送到php代码,然后将其放入数据库中,这样就可以工作了。然后给出了一个成功的Ajax响应,也行得通。然后Ajax将切换出喜欢/不喜欢按钮,同时从“喜欢”范围中添加或获取1个喜欢。然而,它什么也不做。
我几乎百分之百确定这个问题是我忽略了的愚蠢的东西,但我真的找不到它。
发布于 2019-05-17 01:55:48
如果您为ajax请求指定了期望的返回数据类型,而实际的返回值并不是您指定的值,那么您的error/fail函数就会被触发。这是因为添加dataType: "json"会导致ajax尝试将返回值解析为json,当失败时,它会触发错误处理程序。为了解决这个问题,最好省略dataTaype,然后在done函数中添加一个带有JSON.parse的try catch。
E.G
.done(function (string_res) {
console.log(string_res);
try {
var json_obj = JSON.parse(string_res);
console.log(json_obj);
} catch (e) {
console.log('failed to parse');
}
// do work/operations with json_obj not string_res
})
.fail(function (jqXHR, textStatus) {
console.log('failed')
});发布于 2019-05-17 01:56:24
on line中“success”中的拼写错误:if(res.status=="succes"){
发布于 2019-05-17 02:03:42
你可以尝试这样做:
error: function(xhr, status, error) {
console.log(error)
},
success: function(response) {
console.log(response)
}在Ajax函数中,要知道响应在服务器端发生了什么。
https://stackoverflow.com/questions/56173574
复制相似问题