0

我正在尝试在 ajax 中制作一个喜欢/不喜欢的按钮。ajax 将我的数据发送到一个单独的文件,该文件保存在数据库中,并且该文件发回{"status":"success","message":"Like has been saved.","data":{"like":"1"}}我从 chrome 网络响应窗口获得的成功响应。但是$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 个喜欢。然而它完全没有任何作用

我几乎 100% 确定问题是我忽略的一些愚蠢的问题,但我真的找不到。

4

3 回答 3

0

在线“成功”中的错字:if(res.status=="succes"){

于 2019-05-16T17:56:23.813 回答
0

如果您为期望的 ajax 请求指定了返回数据类型,而实际返回的值不是您指定的,那么如果您有错误/失败函数,则会触发您的错误/失败函数。这是因为添加dataType: "json"会导致您使用 ajax 尝试将您的返回值解析为 json,当它失败时,它会触发您的错误处理程序。最好省略 dataTaype 然后JSON.parse在你的 done 函数中添加一个 try catch 来解决这个问题。

例如

.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-16T17:55:47.887 回答
0

你可以试试这个:

error: function(xhr, status, error) { 
    console.log(error)
},
success: function(response) {
    console.log(response)
}

在您的 Ajax 函数中,通过响应了解服务器端发生的情况。

于 2019-05-16T18:03:41.820 回答