jQuery ajax一直呼叫error方法,問題解決
阿新 • • 發佈:2018-11-28
首先說原因,然後再說具體情況:
原因一:返回的json格式不對。
原因二:在返回資料之前不能有任何的輸出,包括開啟除錯。例如:後端用的是php,像在返回json資料之前,echo,var_dump等輸出是不能有的,debug也要關閉。
* 問題描述
實現功能:點贊功能
問題:在頁面點贊,並執行了後端的程式碼,但是前端一直呼叫error方法
下面貼出程式碼來說明該問題
前端程式碼:
$("#like").on("click",function(){
var like_status = $("#like-status").html();
var like_number = parseInt ($("#like-num").html());
$.ajax({
url:"../usercenter/clickLike",
type:"POST",
data: {"like_status":like_status,"like_cnt":like_number,"vid":video_id,"uid":user_id},
dataType:"json",
success:function(data){
alert(data.error_code)
if (data.error_code == 0){
if(like_status == 0){
var num = Math.floor(Math.random() * 3 + 1);
var index=$('.like').children('img').length;
var rand = 20;
$(".like").append("<img class='img-like1' src=''>" );
$(".like").append("<img class='img-like2' src=''>");
$('.img-like1:eq(' + index + ')').attr('src','http://videostyle.qyer.ad/img/ic_feed_like_sel.png');
$('.img-like2:eq(' + index + ')').attr('src','http://videostyle.qyer.ad/img/ic_feed_like_sel.png');
$(".img-like1").animate({
bottom:"300px",
opacity:"0",
left: rand
},2000);
$(".img-like2").animate({
bottom:"400px",
opacity:"0",
left: rand
},2000);
$("#like").removeClass("like-no");
$("#like").addClass("like-yes");
$("#like-status").html(1);
$("#like-num").html(like_number+1);
}else{
$("#like").removeClass("like-yes");
$("#like").addClass("like-no");
$("#like-status").html(0);
$("#like-num").html(like_number-1);
$(".img-like1").remove();
$(".img-like2").remove();
}
}else{
alert(data.error_code);
}
},
error:function(data){
alert("錯誤");
}
});
}).on("touchstart", function(event) {
event.stopPropagation();
});
php端程式碼:
/**
* 使用者點選喜歡,取消喜歡
*/
public function clickLikeAction(){
$uid = getRequestInt("uid");
if(!$uid){
json_error(1,"請先登入");
}
$vid = getRequestInt("vid");
$like_status = getRequestInt("like_status");
$like_cnt = getRequestInt("like_cnt");
if(!$vid){
json_error(1,"vid未得到");
}
if(!$like_status ){//使用者沒有喜歡過才為其新增喜歡,並令喜歡量加1
Table_Video_Vlike::inst()->addUserLike($uid,$vid);
Table_Video_Statistics::inst()->increaseLikeCnt($vid,$like_cnt);
json_success();
}
//取消喜歡,並令喜歡量減1
Table_Video_Vlike::inst()->deleteUserLike($uid,$vid);
$res = Table_Video_Statistics::inst()->decreaseLikeCnt($vid,$like_cnt);
if(!$res){
json_error();
}
json_success();
}
其中json_success() ,json_error()是兩個封裝好的返回給前端的json格式的字串,但是在執行“點選喜歡”的時候,沒有任何問題,當點選“取消喜歡”的時候,資料庫的資料已修改,但是ajax一直呼叫error方法
* 問題解決
網上資料說是json資料格式不對,但是呼叫的是同一個函式,怎麼會json格式不對呢,面對上面的問題覺得很奇怪,後來發現我在decreaseLikeCnt() 這個方法中使用了 echo, 把這個註釋掉問題就解決了。另外一種情況,我開啟了資料庫除錯模式,也會出現ajax一直呼叫error方法。為什麼註釋掉就解決問題了呢?
原因分析: 前後端定義了資料的互動方式,前端預設後端返回的資料格式是一個json而且格式也是規定好的,現在在後端返回給前端資料時,echo或debug等都會導致前端接受不到定義好的json串,從而導致錯誤。