Ajax實現步驟和原理

1、什麼是Ajax?

  Ajax = 異步 JavaScript 和XML。
  Ajax是一種用於建立快速動態網頁的技術。
  經過在後臺與服務器進行少許數據交換,Ajax能夠使網頁實現異步更新。這意味着能夠在不從新加載整個網頁的狀況下,對網頁的某部分進行更新。
  傳統的網頁(不使用 Ajax)若是須要更新內容,必需重載整個網頁面。javascript

2、Ajax工做原理

  Ajax的工做原理至關於在用戶和服務器之間加了—箇中間層(AJAX引擎),使用戶操做與服務器響應異步化。並非全部的用戶請求都提交給服務器,像—些數據驗證和數據處理等都交給Ajax引擎本身來作, 只有肯定須要從服務器讀取新數據時再由Ajax引擎代爲向服務器提交請求。java

     Ajax(Asynchronous javascript and xml),實現了客戶端與服務器進行數據交流過程。使用技術的好處是:不用頁面刷新,而且在等待頁面傳輸數據的同時能夠進行其餘操做。ajax

3、Ajax的使用及實現步驟

  (1) 建立XMLHttpRequest對象,也就是建立一個異步調用對象. 

  (2) 建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息. 

  (3)設置響應HTTP請求狀態變化的函數. 

  (4)發送HTTP請求. 

  (5)獲取異步調用返回的數據. 

  (6)使用JavaScript和DOM實現局部刷新.

AJAX運行步驟與狀態值說明
  在AJAX實際運行當中,對於訪問XMLHttpRequest(XHR)時並非一次完成的,而是分別經歷了多種狀態後取得的結果,對於這種狀態在AJAX中共有5種,分別是:
  0 - (未初始化)尚未調用send()方法
  1 - (載入)已調用send()方法,正在發送請求
  2 - (載入完成)send()方法執行完成,
  3 - (交互)正在解析響應內容
  4 - (完成)響應內容解析完成,能夠在客戶端調用了
  對於上面的狀態,其中「0」狀態是在定義後自動具備的狀態值,而對於成功訪問的狀態(獲得信息)咱們大多數採用「4」進行判斷。
json

第一種:服務器

  經過 Promise 分裝的 Ajaxapp

 

function Param(json) {
    var arr = [];
    for (var i in json) {
        arr,
        arr.push(i + "=" + json[i])
    }
    return arr.join("&");
}


function ajax(a) {
    return new Promise(function(resolve, reject) {
        a = a || {};
        a.type = a.type || "get";
        a.data = a.data || "";
        var xhr = null;
     
     // 處理兼容問題 xhr
= (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"); if (a.type === "get") { a.url += "?" + Param(a.data) + "&t=" + new Date().getTime();
       //調用open()方法並採用異步方式 xhr.open(
"get", a.url, true);
       //使用send()方法將請求發送出去 xhr.send(); }
else if (a.type === "post") { xhr.open("post", a.url, true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(Param(a.data)) } xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(JSON.parse(xhr.responseText)); } else { reject("Err:" + xhr.status) } } } }) }

 

第二種:異步

  經過 class 構造函數分裝的 Ajaxclass Ajax {    constructor() {async

this.xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP') } fn() { this.xhr.onreadystatechange = () => { if (this.xhr.readyState === 4) { if (this.xhr.status === 200) { if (responseType === 'json') { resolve(JSON.parse(this.xhr.responseText)) } else { resolve(this.xhr.responseText) } } else { reject(new Error(this.xhr.status)) } } } } get(opt) { return new Promise((resolve, reject) => { let { url, async = true, params = {}, responseType = 'json' } = opt; if (!url) { return; } url = this.formatData(params) ? url + '?' + this.formatData(params) : url this.xhr.open('get', url, async); this.fn(); this.xhr.send(); }) } post(opt) { return new Promise((resolve, reject) => { let { url, async = true, params = {}, responseType = 'json', paramsType = 'application/x-www-form-urlencoded' } = opt; if (!url) { return; } this.xhr.open('post', url, async); this.fn(); this.xhr.setRequestHeader('content-type', paramsType) this.xhr.send(this.formatData(params, paramsType)); }) } formatData(params, paramsType = 'application/x-www-form-urlencoded') { if (paramsType === 'application/x-www-form-urlencoded') { return Object.entries(params).map(val => val[0] + '=' + val[1]).join('&') } else { return JSON.stringify(params); } } }

AJAX狀態碼說明函數

  1**:請求收到,繼續處理
  2**:操做成功收到,分析、接受
  3**:完成此請求必須進一步處理
  4**:請求包含一個錯誤語法或不能完成
  5**:服務器執行一個徹底有效請求失敗
post

 再具體就以下:

  100——客戶必須繼續發出請求
  101——客戶要求服務器根據請求轉換HTTP協議版本
  200——交易成功
  201——提示知道新文件的URL
  202——接受和處理、但處理未完成
  203——返回信息不肯定或不完整
  204——請求收到,但返回信息爲空
  205——服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件
  206——服務器已經完成了部分用戶的GET請求
  300——請求的資源可在多處獲得
  301——刪除請求數據,重定向
  302——在其餘地址發現了請求數據
  303——建議客戶訪問其餘URL或訪問方式
  304——客戶端已經執行了GET,但文件未變化
  305——請求的資源必須從服務器指定的地址獲得
  306——前一版本HTTP中使用的代碼,現行版本中再也不使用
  307——申明請求的資源臨時性刪除
  400——錯誤請求,如語法錯誤
  401——請求受權失敗
  402——保留有效ChargeTo頭響應
  403——請求不容許
  404——沒有發現文件、查詢或URl
  405——用戶在Request-Line字段定義的方法不容許
  406——根據用戶發送的Accept拖,請求資源不可訪問
  407——相似401,用戶必須首先在代理服務器上獲得受權
  408——客戶端沒有在用戶指定的餓時間內完成請求
  409——對當前資源狀態,請求不能完成
  410——服務器上再也不有此資源且無進一步的參考地址
  411——服務器拒絕用戶定義的Content-Length屬性請求
  412——一個或多個請求頭字段在當前請求中錯誤
  413——請求的資源大於服務器容許的大小
  414——請求的資源URL長於服務器容許的長度
  415——請求資源不支持請求項目格式
  416——請求中包含Range請求頭字段,在當前請求資源範圍內沒有range指示值,請求也不包含If-Range請求頭字段
  417——服務器不知足請求Expect頭字段指定的指望值,若是是代理服務器,多是下一級服務器不能知足請求
  500——服務器產生內部錯誤
  501——服務器不支持請求的函數
  502——服務器暫時不可用,有時是爲了防止發生系統過載
  503——服務器過載或暫停維修
  504——關口過載,服務器使用另外一個關口或服務來響應用戶,等待時間設定值較長
  505——服務器不支持或拒絕支請求頭中指定的HTTP版本

 

參考文件:

  https://www.jb51.net/article/74357.htm

  http://www.javashuo.com/article/p-gkzmaplb-cb.html

相關文章
相關標籤/搜索