《走過的路 踩過的坑》--jQuery ajax dataType返回出錯問題及解決
1需求
目前在維護一個專案。接到一個需求是要在某個儲存動作之前增加一步校驗,如果校驗通過則可以進行儲存,否則返回錯誤提示並阻止儲存動作。
因為是寄存專案,儲存動作是通過js提交表單傳送請求動作,所以在不改變其業務邏輯的前提下,我選擇了在儲存之前使用jQuery ajax增加一個校驗方法。success回撥處從後端拿到一個JSON格式的響應,包含一個布林型別的flag。
demo如下:
function chkXXX(name){
var result;
$.ajax({
type:"post",
url:"chkXXX.do",
dataType:"json",
data: $("#add_form").serialize(),
async:false,
success:function(backdata){
var r = jQuery.parseJSON(backdata);
result = r;
},
error:function(xhr, status, e){
alert(status);
}
});
return result;
}
2問題
在三下五除二快速搞定上線後,隔天運維MM就接到反饋,告知此功能並沒有work。。。(我靠,不可能吧。寫過辣麼多類似的校驗,怎麼就你罷工了呢)
開始以為是瀏覽器相容性問題,因為遇到好多此種情況(比如有些情況在 win7 ie8可以,但在xp ie8 就不行),但是我在使用ie,chrome除錯以後發現都不正常,
這個時候開啟chrome的F12,報錯資訊提示 返回的flag 為null,但是我後端明明只返回true,false兩種情況,這個時候基本確定問題就出在前端了。
斷點debug,跟蹤到的resut 確實是null,非後臺JSON。看來問題就定位到:
var r = jQuery.parseJSON(backdata);
3原因
其實問題的根本原因還是在於自己對ajax原理的不熟悉。
這裡我忽略一個細節,就是我在設定請求屬性的時候,設定了:
dataType:"json",
var r = jQuery.parseJSON(backdata);
衝突了。預期伺服器返回的資料型別。
如果不指定,jQuery 將自動根據 HTTP 包 MIME 資訊來智慧判斷,比如 XML MIME 型別就被識別為 XML。在 1.4 中,JSON 就會生成一個 JavaScript 物件,而 script 則 會執行這個指令碼。隨後伺服器端返回的資料會根據這個值解析後,傳遞給回撥函式。可用值:
"xml": 返回 XML 文件,可用 jQuery 處理。
"html": 返回純文字 HTML 資訊;包含的 script 標籤會在插入 dom 時執行。
"script": 返回純文字 JavaScript 程式碼。不會自動快取結果。除非設定了 "cache" 引數。注意:在遠端請求時(不在同一個域下),所有 POST 請求都將轉為 GET 請求。(因為
將使用 DOM 的 script標籤來載入)
"json": 返回 JSON 資料 。
"jsonp": JSONP 格式。使用 JSONP 形式呼叫函式時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函式名,以執行回撥函式。
"text": 返回純文字字串
設定dataType以後,返回的資料型別就已經是JSON物件了,再使用jq轉換就出錯了。
4解決
既然知道原因了,就知道解決方案了
其一就是設定dataType屬性後,直接返回backdata;
其二則是不設施dataType,返回JSON格式的字串,然後手動轉換成JSON物件;
5總結
走過的路,踩過的坑。以後還需努力啊!
相關文章
- Redis 叢集部署及踩過的坑Redis
- GeoServer 踩過的坑Server
- jQuery的AJAX請求中contentType和dataType的區別jQuery
- Material過渡+Glide顯示問題踩坑IDE
- JQuery中ajax的使用與快取問題的解決方法jQuery快取
- 內購支付踩過的坑以及自己的解決途徑
- JasperReport 中踩過的坑
- weex官方文件手冊上問題和踩過的幾個坑。
- 解決React通過ajax載入資料更新頁面不加判斷會報錯的問題React
- 解析資料踩過的坑
- 你踩過flutter的坑嗎Flutter
- 親自踩過的vue的坑Vue
- 校招那些坑,是我走過最長的路
- 快取過程存在的三大問題及解決方案快取
- 解決 jquery使用ajax請求發生跨域問題的辦法jQuery跨域
- wepy小程式踩過的坑(1)
- 安裝 Laravel/horizon 踩過的坑Laravel
- Compose 延遲列表踩過的坑
- uniapp之那些年踩過的坑APP
- 分享:Linux 命令列的藝術--走過路過不要錯過(37k 的 star)Linux命令列
- 解決ajax請求引數過多導致引數被截斷的問題
- 【JavaScript】通過封裝自己的JSONP解決瀏覽器的跨域問題(Ajax跨域)JavaScript封裝JSON瀏覽器跨域
- vue專案中踩過的element的坑Vue
- 踩過的坑(一)——web容器升級Web
- linux環境壓測踩過的坑Linux
- 那些年走過下劃線的坑
- Python之列表的append()方法最容易踩的坑及解決PythonAPP
- 記:css繪製小豬佩奇的專案及踩過的坑CSS
- 【Linux】解決tomcat出現Toomanyopenfiles(開啟的檔案過多)問題LinuxTomcatOOM
- 如何捕獲問題SQL解決過度CPU消耗的問題SQL
- 工資過萬整數出錯問題
- 小程式的這些坑你踩過嗎?
- 使用ABP框架中踩過的坑系列2框架
- 當年用httpclient時踩過的那些坑HTTPclient
- IDEA建立Maven專案中踩過的坑IdeaMaven
- 記錄自己在tensorflow中踩過的坑
- IT人,那些年,一起踩過的坑
- jquery-weui微信支付報錯問題解決jQueryUI
- Vue與Element走過的坑。。。。帶上AxiosVueiOS