# jQuery 的 $.ajax() 筆記 ###### tags: `JavaScript`, `Ajax` * [XMLHttpRequest — JavaScript 發送 HTTP 請求 (I)](https://notfalse.net/29/xmlhttprequest) * [jQuery Ajax — JavaScript 發送 HTTP 請求 (II)](https://notfalse.net/30/jquery-ajax) * 筆記 1. jQuery實作ajax的方法 * 低階用法(Low-Level Interface): [jQuery.ajax()](https://api.jquery.com/jquery.ajax/) * 簡短用法(Shorthand Methods): |方法 |說明 | |----|----| |[jQuery.get()](https://api.jquery.com/jQuery.get/)|實作HTTP GET請求| |[jQuery.post()](https://api.jquery.com/jQuery.post/)|實作HTTP POST請求| |[jQuery.getJSON()](https://api.jquery.com/jQuery.getJSON/)|實作HTTP GET請求,載入JSON資料| |[jQuery.getScript()](https://api.jquery.com/jQuery.getScript/)|實作HTTP GET請求,載入JavaScript檔案並執行| * 方式一:[$.ajax()](https://api.jquery.com/jquery.ajax/) ```javascript $.ajax({ url: 'api/imgData.json', dataType: 'json' }) .always(function(obj) { console.log(obj); }); ``` * 方式二:[jQuery.getJSON()](https://api.jquery.com/jquery.getjson/) ```javascript $.getJSON('api/imgData.json', {}, function(json, textStatus) { console.log(json); }); ``` 2. 多個ajax的處理方式 * 不管執行順序,多個ajax執行完後給一個結果:[jQuery.when()](https://api.jquery.com/jQuery.when/) ```javascript // 三個ajax操作都結束以後,才執行then方法指定的 doneCallbacks 函式 var ajax1 = $.get("main/func1/"); var ajax2 = $.post("main/func2/","condition"); var ajax3 = $.get("main/func3/"); var doneCallbacks = function(res1,res2,res3){ console.log('ajax1:',res1) console.log('ajax2:',res2) console.log('ajax3:',res3) $('body').append('<p>三個ajax都執行完了!</p>') } var failCallbacks = function() { console.log("ajax執行有問題!"); } $.when(ajax1,ajax2,ajax3) .then(doneCallbacks, failCallbacks); ``` * 執行的順序很重要,要一步接著一步走:[jQuery.deferred();](https://api.jquery.com/jQuery.Deferred/) / [promise();](https://api.jquery.com/promise/) (jQuery 1.5 以上才支援) ```javascript function ajax1(){ var def = $.Deferred() $.ajax({ url: 'http://www.yacoding.com/jquery.php?ran='+Math.random(), dataType: 'json' }).then(function(){ $('body').append('<p>ajax1 success</p>') def.resolve() },function(){ $('body').append('<p>ajax1 fail</p>') def.reject() }) return def.promise() } function ajax2(){ var def = $.Deferred() $.ajax({ url: './api/test1.json?ran='+Math.random(), dataType: 'json' }).then(function(){ $('body').append('<p>ajax2 success</p>') def.resolve() },function(){ $('body').append('<p>ajax2 fail</p>') def.reject() }) return def.promise() } function ajax3(){ var def = $.Deferred() $.ajax({ url: './api/test2.json?ran='+Math.random(), dataType: 'json' }).then(function(){ $('body').append('<p>ajax3 success</p>') def.resolve() },function(){ $('body').append('<p>ajax3 fail</p>') def.reject() }) return def.promise() } ajax1().then(ajax2).then(ajax3).then(function(){ $('body').append('<p>三個ajax都執行完了!</p>') },function(){ $('body').append('<p>ajax執行有問題!</p>') }) ``` 4. 建議讓ajax結構單純化,將大量處理畫面的邏輯用函式獨立出來。 ```javascript $.ajax({ url: './api/imgData.json', dataType: 'json' }) .done(function(res) { init(res.list); }) function init(list){ $.each(list, function(index, value) { $("<li></li>").append($("<img>") .attr('src',value.src)).appendTo($('.imgList')) }); } ``` * 延伸閱讀 1. [MDN Web Doc - Ajax](https://developer.mozilla.org/zh-TW/docs/Web/Guide/AJAX) 2. [什麼是 Ajax? 搞懂非同步請求 (Asynchronous request)概念](https://tw.alphacamp.co/blog/ajax-asynchronous-request) 3. [卡伯斯Blog - AJAX 完整解說系列:基礎觀念](https://wcc723.github.io/development/2020/09/30/about-ajax/) 4. [卡伯斯Blog - AJAX 完整解說系列:新增、更新、刪除(POST/PATCH/DELETE)](https://wcc723.github.io/development/2020/10/01/about-ajax-2/) 5. [卡伯斯Blog - AJAX 完整解說系列:使用 Chrome Devtools 檢視請求及回應](https://wcc723.github.io/development/2020/10/02/about-ajax-3/) 6. [卡伯斯Blog - AJAX 完整解說系列:輕鬆搞懂 HTTP 狀態碼(HTTP Status Code)](https://wcc723.github.io/development/2020/10/03/about-ajax-4/) 7. [MDN Web Doc - Promise 物件](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Promise) 8. [使用 JQuery 透過 FormData 上傳檔案](https://askie.today/using-formdata-and-setting-multipart-to-upload-file-by-ajax/) 9. ajax 替代方案: * [axios](https://axios-http.com/) * JavaScript原生介面 [Fetch API](https://developer.mozilla.org/zh-TW/docs/Web/API/Fetch_API/Using_Fetch)