最近幾天一直都在解決error問題,周末都沒能好好過,悲痛萬分,想逃走😭.....
一、悲痛的開端
項目用jQuery的ajax方法請求php后台,前台代碼寫的沒有問題,后台返回的json數據大概也是對的(猜的,后來驗證了json是對的),然后悲劇就如約而至;
先看核心代碼:
$.ajax({ type:"POST", url:"{:U('City/adds')}", data:{}, dataType: 'json', success:function(data){if( data.status == 1 ){ layer.msg('成功* ̄▽ ̄*'); setInterval(function(){ var index = parent.layer.getFrameIndex(window.name); parent.layer.close(index); window.parent.location.reload(); },1000) }else{ layer.msg('失敗>﹏<'); } }, error: function (XMLHttpRequest, textStatus, errorThrown) { //console.log(XMLHttpRequest.status); //console.log(XMLHttpRequest.readyState); //console.log(textStatus); } })
問題一:請求成功進入success方法,但出現下面的報錯,
Uncaught SyntaxError: Unexpected token < in JSON at position 0
翻一下Network面板,看到請求響應的數據是 <pre>array(3){...}</pre> 字符串,繼續忍...
開始分析找解決辦法;
報錯代碼是“JSON位置0處發現不能識別的標記<”,意思是說響應的數據不是json數據,那就各種各樣的方法試一試;
先嘗試改前端代碼,不指定‘dataType’,在success中方法去掉<pre></pre>,發現就不會報錯了,但問題二來了;
去掉<pre></pre>,用的是: jQuery(data).text()
問題二:請求成功但一直進入error方法,無任何報錯;

Preview下是json數據,校驗無任何問題;
Response下發現數據前面多了一個小紅點·,是數據的問題,ajax死活都不給解析,才一直進入error方法;
然后跟后台商量,返回的數據有問題,需要注意下格式;
我就去百度搜索啊,發現真是后台數據的問題,沒有注意過紅點問題;
在后端返回數據前用方法ob_clean()清空輸出,返回的類型是Object,不再是String,由此成功~~
二、開心的結局,啰嗦聊幾句
問題一和問題二都能在后台用ob_clean()完美解決。
問題一是在前台解決,但對於數據量多的情況並不適用,所以慎用;
可以讓后台嘗試 echo json_encode($data,true); echo json_encode($obj,JSON_UNESCAPED_UNICODE); 或者自己來~ 方法多種多樣,總有適合的一個;
echo json_encode($data,true); echo json_encode($obj,JSON_UNESCAPED_UNICODE);
總結問題一和問題二,都是一個問題引出 -> Json數據不夠嚴謹,導致前台解析出錯。
Json數據不夠嚴謹就更得說了,例如一個全角和半角的空格、單雙引號出現的{k:v}、json中的注釋語句等一些細小的問題都會引起;
如果大家也遇上了同樣的問題,但不能用同樣的方式解決,一定要找各方面的原因,不要局限於ajax代碼部分有沒有寫錯,后台給的確實是json,而是去找類型/解析/書寫/空傳值等情況分析,不同代碼不同分析方式;
最后硬要說是誰的鍋,不好講,還是需要前端和后台一起配合才更好更快的完成😘。
記錄一下此次的解決過程,感謝大家~😘
