Ajax原理一篇就夠了

前言

AJAX即「Asynchronous Javascript And XML」,是指一種建立交互式網頁應用的網頁開發技術。AJAX 是一種用於建立快速動態網頁的技術。它能夠令開發者只向服務器獲取數據(而不是圖片,HTML文檔等資源),互聯網資源的傳輸變得史無前例的輕量級和純粹,這激發了廣大開發者的創造力,使各式各樣功能強大的網絡站點,和互聯網應用如雨後春筍通常冒出,不斷帶給人驚喜。javascript

本文首發地址爲GitHub博客,寫文章不易,請多多支持與關注!html

1、什麼是Ajax

Ajax是一種異步請求數據的web開發技術,對於改善用戶的體驗和頁面性能頗有幫助。簡單地說,在不須要從新刷新頁面的狀況下,Ajax 經過異步請求加載後臺數據,並在網頁上呈現出來。常見運用場景有表單驗證是否登入成功、百度搜索下拉框提示和快遞單號查詢等等。**Ajax的目的是提升用戶體驗,較少網絡數據的傳輸量。**同時,因爲AJAX請求獲取的是數據而不是HTML文檔,所以它也節省了網絡帶寬,讓互聯網用戶的網絡衝浪體驗變得更加順暢。java

2、Ajax原理是什麼

在解釋Ajax原理以前,咱們不妨先舉個「領導想找小李彙報一下工做」例子,領導想找小李問點事,就委託祕書去叫小李,本身就接着作其餘事情,直到祕書告訴他小李已經到了,最後小李跟領導彙報工做。git

Ajax請求數據流程與「領導想找小李彙報一下工做」相似。其中最核心的依賴是瀏覽器提供的XMLHttpRequest對象,它扮演的角色至關於祕書,使得瀏覽器能夠發出HTTP請求與接收HTTP響應。瀏覽器接着作其餘事情,等收到XHR返回來的數據再渲染頁面。github

理解了Ajax的工做原理後,接下來咱們探討下如何使用Ajax。web

3、Ajax的使用

1.建立Ajax核心對象XMLHttpRequest(記得考慮兼容性)

1. var xhr=null;  
	2. if (window.XMLHttpRequest)  
	3.   {// 兼容 IE7+, Firefox, Chrome, Opera, Safari  
	4.   xhr=new XMLHttpRequest();  
	5.   } else{// 兼容 IE6, IE5 
	6.     xhr=new ActiveXObject("Microsoft.XMLHTTP");  
	7.   } 
複製代碼

2.向服務器發送請求

1. xhr.open(method,url,async);  
    2. send(string);//post請求時才使用字符串參數,不然不用帶參數。
複製代碼
  • method:請求的類型;GET 或 POSTajax

  • url:文件在服務器上的位置瀏覽器

  • async:true(異步)或 false(同步) 注意:post請求必定要設置請求頭的格式內容緩存

xhr.open("POST","test.html",true);  
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");  
xhr.send("fname=Henry&lname=Ford");  //post請求參數放在send裏面,即請求體
複製代碼

3.服務器響應處理(區分同步跟異步兩種狀況)

responseText 得到字符串形式的響應數據。安全

responseXML 得到XML 形式的響應數據。

①同步處理

1. xhr.open("GET","info.txt",false);  
	2. xhr.send();  
	3. document.getElementById("myDiv").innerHTML=xhr.responseText; //獲取數據直接顯示在頁面上
複製代碼

②異步處理

相對來講比較複雜,要在請求狀態改變事件中處理。

1. xhr.onreadystatechange=function()  { 
	2.    if (xhr.readyState==4 &&xhr.status==200)  { 
	3.       document.getElementById("myDiv").innerHTML=xhr.responseText;  
	4.      }
	5.    } 
複製代碼

什麼是readyState?

readyState是XMLHttpRequest對象的一個屬性,用來標識當前XMLHttpRequest對象處於什麼狀態。 readyState總共有5個狀態值,分別爲0~4,每一個值表明了不一樣的含義

  • 0:未初始化 -- 還沒有調用.open()方法;
  • 1:啓動 -- 已經調用.open()方法,但還沒有調用.send()方法;
  • 2:發送 -- 已經調用.send()方法,但還沒有接收到響應;
  • 3:接收 -- 已經接收到部分響應數據;
  • 4:完成 -- 已經接收到所有響應數據,並且已經能夠在客戶端使用了;

什麼是status?

HTTP狀態碼(status)由三個十進制數字組成,第一個十進制數字定義了狀態碼的類型,後兩個數字沒有分類的做用。HTTP狀態碼共分爲5種類型:

常見的狀態碼

僅記錄在 RFC2616 上的 HTTP 狀態碼就達 40 種,若再加上 WebDAV(RFC491八、5842)和附加 HTTP 狀態碼 (RFC6585)等擴展,數量就達 60 餘種。接下來,咱們就介紹一下這些具備表明性的一些狀態碼。

  • 200 表示從客戶端發來的請求在服務器端被正常處理了。
  • 204 表示請求處理成功,但沒有資源返回。
  • 301 表示永久性重定向。該狀態碼錶示請求的資源已被分配了新的URI,之後應使用資源如今所指的URI。
  • 302 表示臨時性重定向。
  • 304 表示客戶端發送附帶條件的請求時(指採用GET方法的請求報文中包含if-matched,if-modified-since,if-none-match,if-range,if-unmodified-since任一個首部)服務器端容許請求訪問資源,但因發生請求未知足條件的狀況後,直接返回304Modified(服務器端資源未改變,可直接使用客戶端未過時的緩存)
  • 400 表示請求報文中存在語法錯誤。當錯誤發生時,需修改請求的內容後再次發送請求。
  • 401 表示未受權(Unauthorized),當前請求須要用戶驗證
  • 403 表示對請求資源的訪問被服務器拒絕了
  • 404 表示服務器上沒法找到請求的資源。除此以外,也能夠在服務器端拒絕請求且不想說明理由時使用。
  • 500 表示服務器端在執行請求時發生了錯誤。也有多是Web應用存在的bug或某些臨時的故障。
  • 503 表示服務器暫時處於超負載或正在進行停機維護,如今沒法處理請求。

③GET和POST請求數據區別

  • 使用Get請求時,參數在URL中顯示,而使用Post方式,則放在send裏面
  • 使用Get請求發送數據量小,Post請求發送數據量大
  • 使用Get請求安全性低,會被緩存,而Post請求反之 關於第一點區別,詳情見下面兩張圖:

4、結束語

其實經過 XMLHttpRequest或者封裝後的框架進行網絡請求,這種方式已經有點老舊了,配置和調用方式很是混亂,近幾年剛剛出來的Fetch提供了一個更好的替代方法,它不只提供了一種簡單,合乎邏輯的方式來跨網絡異步獲取資源,並且能夠很容易地被其餘技術使用。

想了解如何利用Fetch請求數據,請猛戳 fetch 如何請求常見數據格式

想了解Ajax如何請求後臺數據,請猛戳 Ajax請求後臺數據

參考文章

javascript教程

Ajax 簡介

不再學AJAX了!(一)AJAX概述

HTTP菜鳥教程

AJAX的POST和GET請求的區別

相關文章
相關標籤/搜索