# AJAX 文章跟範例 ###### tags: `AJAX` ![](https://i.imgur.com/nh888nU.png) > 關鍵字 > AJAX > AJAX XMLHttpRequest > AJAX Fetch API > AJAX jQuery > AJAX axios > ES6 Promise ___ ### 什麼是 [AJAX - wiki](https://zh.wikipedia.org/wiki/AJAX)? AJAX 是 **Asynchronous JavaScript and XML** 的縮寫,中文名稱為「非同步 JavaScript 及 XML」,這個名詞出自 《Ajax: A New Approach to Web Applications》。 原意指的是透過 JavaScript 的非同步通訊,從服務器獲取 XML 從中提取資料,再更新當前網頁的對應部分,而不用刷新整個網頁。 但後來,AJAX 這詞成為了 JavaScript 向伺服器發送 HTTP 請求的代名詞。不是指一種單一的技術,而是一種多技術的組合,其內容包含的技術有 HTML 或 XHTML、層疊樣式表、JavaScript、文件物件模型、XML、XSLT 以及最重要的 XMLHttpRequest 物件等等。當這些技術被結合在 AJAX 模型中,Web 應用程式便能快速、即時更動介面及內容,不需要重新讀取整個網頁,讓程式更快回應使用者的操作。 雖然 X 在 AJAX 中代表 XML,但後來 JSON 格式是最為流行的資料格式。 ### 為甚麼有 AJAX ,它提供了甚麼服務?? AJAX 是一種在無需重新加載整個網頁的情況下,能夠更新部分網頁的技術。 ### AJAX 與 XMLHttpRequest API AJAX 技術在瀏覽器上,會利用 JavaScript(XMLHttpRequest 物件)與伺服器進行非同步傳遞,並將結果由 DOM 反映至頁面上。 ### AJAX 與 Fetch API 傳統 AJAX 操作是使用 XMLHttpRequest(XHR)物件來實現,而 Fetch API 是近年來被提及將要取代 XMLHttpRequest 的技術新標準,是一個 HTML5 的 API,並非來自ECMAScript標準。還有它使用了**ES6 Promise**的新特性。 ### AJAX 與 jQuery 外部函式庫例如jQuery很早就看到XMLHttpRequest物件中在使用的問題,使用像jQuery的函式庫來撰寫AJAX相關功能,不光是在解決不同瀏覽器中的不相容問題,或是提供簡化語法這麼簡單而已。**jQuery它擴充了原有的XHR物件為jqXHR物件,並加入類似於Promise的介面與Deferred Object(延遲物件)的設計。** ### AJAX 與 axios 使用 axios套件來處理AJAX,Axios本質上是對XHR的封裝,只不過他是Promise的實現版本,可以用在瀏覽器和node.js中,符合最新的ES規範,首先看個Code ___ ### 參考連結 > 範例文章 > [由前端request 的幾種方法 - 推](https://medium.com/dot-js/%E7%94%B1%E5%89%8D%E7%AB%AFrequest-%E7%9A%84%E5%B9%BE%E7%A8%AE%E6%96%B9%E6%B3%95-fbf8a0b4023a) > [關於AJAX與那些前端的request方法](https://medium.com/unitsexhibition/%E9%97%9C%E6%96%BCajax%E8%88%87%E9%82%A3%E4%BA%9B%E5%89%8D%E7%AB%AF%E7%9A%84request%E6%96%B9%E6%B3%95-720a7c9cd220) > [AJAX與那些前端的request方法](https://explosionunis.netlify.app/javascript/js-ajax.html) > [Web開發學習筆記15 — AJAX、API、JSON、Axios](https://teagan-hsu.coderbridge.io/2021/01/04/ajax-api-json-axios/) > 教程連結 > [w3schools - ajax](https://www.w3schools.com/js/js_ajax_intro.asp) > [w3schools - jquery - ajax](https://www.w3schools.com/jquery/jquery_ajax_intro.asp) > [菜鸟教程 - ajax](https://www.runoob.com/ajax/ajax-tutorial.html) > [w3school.cn - ajax](https://www.w3school.com.cn/js/js_ajax_intro.asp) > [w3school.cn jQuery - AJAX 简介](https://www.w3school.com.cn/jquery/jquery_ajax_intro.asp) > [MDN - Ajax](https://developer.mozilla.org/zh-TW/docs/Web/Guide/AJAX) > [tw511 - tw511](http://www.tw511.com/19/244/9974.html) > [简单教程 - ajax](https://www.twle.cn/l/yufei/ajax/ajax-basic-index.html) > 技術概念 > [Jquery ajax, Axios, Fetch區別之我見 - 推](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/147000/) > [什麼是 Ajax? 搞懂非同步請求 (Asynchronous request)概念](https://tw.alphacamp.co/blog/ajax-asynchronous-request) > Blog文章 > [從ES6開始的JavaScript學習生活 - AJAX與Fetch API - 推](https://eyesofkids.gitbooks.io/javascript-start-from-es6/content/part4/ajax_fetch.html?source=post_page---------------------------) > [竹白記事本 - AJAX](https://chupai.github.io/posts/2008/js_ajax/) > [jQuery 教學(二):Ajax 技術](https://summer10920.github.io/2020/04-29/jq-baseclass-2/) > [[JavaScript] AJAX 簡介:實作篇](https://zwh.zone/javascript-ajax--e7-b0-a1-e4-bb-8b/) > [jQuery ajax、axios、fetch 比較](https://kim85326.github.io/2019/11/01/jQuery-ajax-axios-fetch-%E6%AF%94%E8%BC%83/) > [ajax,axios,fetch三種ajax請求的區別](https://kknews.cc/zh-tw/code/3q9j3ko.html) > [前後端資料互動—Ajax 、Fetch 和 Axios 優缺點及比較](https://www.gushiciku.cn/pl/ghz2/zh-tw) > [axios 基本使用 & Config](https://ithelp.ithome.com.tw/articles/10212120) > iT邦幫忙 > [從頭開始的API 和ajax 系列](https://ithelp.ithome.com.tw/users/20102891/ironman/1955) > [JavaScript 試煉之旅 系列 - 第24-29篇](https://ithelp.ithome.com.tw/users/20120099/ironman/2593?page=1) > [網頁學習日誌 系列- 第15-17篇](https://ithelp.ithome.com.tw/users/20107321/ironman/1390?page=2) > [花三十天找到 JavaScript 沙漠中的綠洲系列 - 第24-25篇](https://ithelp.ithome.com.tw/users/20129635/ironman/3195) > [request的方式? ajax & fetch & axios](https://ithelp.ithome.com.tw/articles/10244631) > [axios基本語法與練習(GET、POST請求) - 推](https://ithelp.ithome.com.tw/articles/10253259) > [Fetch API - MDN](https://developer.mozilla.org/zh-TW/docs/Web/API/Fetch_API/Using_Fetch#%E4%BD%BF%E7%94%A8_fetch_%E7%99%BC%E9%80%81%E8%AB%8B%E6%B1%82_request) > [使用Http request - Fetch Api](https://ithelp.ithome.com.tw/articles/10221020) > 相關文章 > [AJAX 筆記](https://medium.com/%E9%A6%AC%E6%A0%BC%E8%95%BE%E7%89%B9%E7%9A%84%E5%86%92%E9%9A%AA%E8%80%85%E6%97%A5%E8%AA%8C/js-ajax-%E7%AD%86%E8%A8%98-b9a57976fa60) > [ Ruby on Rails 實戰聖經 - Ajax 應用程式](https://ihower.tw/rails/fullstack/ajax.html) > [AJAX - 筆記 - 推](http://test.domojyun.net/MEMO/JavaScript/10_ajax.html) > [AJAX JavaScript 與 jQuery 教學範例 for PHP - 推](https://www.footmark.info/programming-language/php/ajax-javascript-jquery-example-php/) > [Ajax 範例 1](https://code101.app/docs/js/ajax/js-ajax-ajaxEx1) > [超簡單 Ajax 範例](http://blog.tonycube.com/2009/03/ajax.html) > [測試 jQuery 的 Ajax 函數 ajax()](http://yhhuang1966.blogspot.com/2019/12/jquery-ajax-ajax.html) > [axios - finally](https://cloud.tencent.com/developer/article/1668175) > [JavaScript Fetch API 使用教學](https://www.oxxostudio.tw/articles/201908/js-fetch.html) > 免費測試用API > [reqres](https://reqres.in/) > [reqres - postman](https://documenter.getpostman.com/view/6961294/S1TVXyAS) > > Reqres API 相關文章 > [使用 URLSession 串接 REST API,練習 http get,post,delete,put,以 Reqres API 為例](https://medium.com/%E5%BD%BC%E5%BE%97%E6%BD%98%E7%9A%84-swift-ios-app-%E9%96%8B%E7%99%BC%E5%95%8F%E9%A1%8C%E8%A7%A3%E7%AD%94%E9%9B%86/%E4%BD%BF%E7%94%A8-urlsession-%E4%B8%B2%E6%8E%A5-http-get-post-delete-put-api-%E4%BB%A5-reqres-api-%E7%82%BA%E4%BE%8B-f977ec876c33) ___ ### 範例 #### XMLHttpRequest ``` //https://medium.com/dot-js/%E7%94%B1%E5%89%8D%E7%AB%AFrequest-%E7%9A%84%E5%B9%BE%E7%A8%AE%E6%96%B9%E6%B3%95-fbf8a0b4023a <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <p class="result"></p> <script> const result = document.querySelector('.result'); function reqOnload () { //responseText JSON格式的字串 const data = JSON.parse(this.responseText); //data JS物件 console.log(data); var email =data.results[0].email; result.textContent=email; } function reqError (err) { console.log('錯誤', err) } // 宣告一個 XHR 的物件 var xhr = new XMLHttpRequest(); // 定義連線方式 xhr.open('get', 'https://randomuser.me/api/', true); // 送出請求 xhr.send(); // 如果成功就執行 reqOnload() xhr.onload = reqOnload; // 失敗就 reqError() xhr.onerror = reqError; </script> </body> </html> ``` ``` //使用 reqres api 做練習 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <p class="result"></p> <script> const result = document.querySelector('.result'); // 宣告一個 XHR 的物件 var xhr = new XMLHttpRequest(); // 定義連線方式 xhr.open('get', 'https://reqres.in/api/users/2', true); // 送出請求 xhr.send(); // 如果成功就執行 reqOnload() xhr.onload = function () { //responseText JSON格式的字串 const data = JSON.parse(this.responseText); //data JS物件 console.log(data); var email =data.data.email; result.textContent=email; } // 失敗就 reqError() xhr.onerror = function (err) { console.log('錯誤', err) } </script> </body> </html ``` #### jQuery ``` 非同步HTTP請求 $.ajax({ type: 'POST', //GET or POST url: "jquery-ajax", //請求的頁面 cache: false, //防止抓到快取的回應 data: {todo:"ajaxexample1"}, //要傳送到頁面的參數 success: functionSucceed, //當請求成功後此事件會被呼叫 error: functionFailed, //當請求失敗後此事件會被呼叫 statusCode: { //狀態碼處理 404: function() { alert("page not found"); } } }); ``` ``` //https://medium.com/dot-js/%E7%94%B1%E5%89%8D%E7%AB%AFrequest-%E7%9A%84%E5%B9%BE%E7%A8%AE%E6%96%B9%E6%B3%95-fbf8a0b4023a //https://ithelp.ithome.com.tw/articles/ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <span class="result"></span> <!-- jquery cdn--> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> var result = $(".result"); $.ajax({ // 請求資料的網址 url: 'https://randomuser.me/api/', // 請求資料的方式(Ex:POST / GET / PUT...等) methods:'get', // 請求資料的類型(Ex:xml, json, script, or html...等) dataType: 'json', // 當成功接收到資料時,success 會執行並顯示結果。 success: function(response) { console.log(response); result.html(response.results[0].email) }, // 當接收資料失敗時,error 會執行並顯示結果。 error: function (thrownError) { console.log(thrownError); } }); </script> </body> </html> ``` ``` //使用 reqres api 做練習 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <span class="result"></span> <!-- jquery cdn--> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> var result = $(".result"); $.ajax({ url: 'https://reqres.in/api/users/2', dataType: 'json', success: function(data) { console.log(data); result.html(data.data.email) } }); </script> </body> </html> ``` #### Axios ``` //https://medium.com/dot-js/%E7%94%B1%E5%89%8D%E7%AB%AFrequest-%E7%9A%84%E5%B9%BE%E7%A8%AE%E6%96%B9%E6%B3%95-fbf8a0b4023a //https://ithelp.ithome.com.tw/articles/10253259 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <span class="result"></span> <!-- jquery cdn--> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> // find elements const result = document.querySelector('.result'); //寫法1 // axios.get('https://randomuser.me/api/') // .then(function (response) { // console.log(response); // let data = response.data; // result.textContent = data.results[0].email; // }) // .catch(function (error) { // // handle error // console.log(error); // }) // .finally(function () { // // always executed // console.log('I always Execued'); // }); //寫法2 axios({ method: "get", url: "https://randomuser.me/api/", }) .then(function (response) { console.log(response); let data = response.data; result.textContent = data.results[0].email; }) .catch(function (error) { // handle error console.log(error); }) .finally(function () { // always executed console.log('I always Execued'); }); </script> </body> </html> ``` ``` //使用 reqres api 做練習 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <span class="result"></span> <!-- jquery cdn--> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> // find elements const result = document.querySelector('.result'); axios.get('https://reqres.in/api/users/2') .then(function (response) { console.log(response); let data = response.data; result.textContent = data.data.email; }) .catch(function (error) { // handle error console.log(error); }) .finally(function () { // always executed console.log('I always Execued'); }); </script> </body> </html> ``` #### Fetch ``` //https://medium.com/dot-js/%E7%94%B1%E5%89%8D%E7%AB%AFrequest-%E7%9A%84%E5%B9%BE%E7%A8%AE%E6%96%B9%E6%B3%95-fbf8a0b4 //https://www.oxxostudio.tw/articles/201908/js-fetch.html //https://ithelp.ithome.com.tw/articles/10252941 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <span class="result"></span> <script> const result = document.querySelector('.result'); fetch('https://randomuser.me/api/', {}) .then((response) => { console.log(response); return response.json(); }).then((data) => { // data 接收 response.json() var email =data.results[0].email; result.textContent = email; }).catch((err) => { console.log('錯誤:', err); }); </script> </body> </html> ``` ``` //使用 reqres api 做練習 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <span class="result"></span> <script> const result = document.querySelector('.result'); //method 預設為 get fetch('https://reqres.in/api/users/2', {method: 'get',}) .then((response) => { console.log(response); //把資料轉成JSON格式 return response.json(); }).then((data) => { // data 接收 response.json() console.log(data); var email =data.data.email; result.textContent = email; }).catch((err) => { console.log('錯誤:', err); }); </script> </body> </html> ```