ajax基礎總結筆記

AJAX

AJAX,即 Asynchronous(異步的) JavaScript and XML。
AJAX不是一門新的語言,而是對現有技術的綜合運用。
其本質是在HTTP協議的基礎上以異步的方式與服務器進行通信。
AJAX是一種用于創建快速動態網頁的技術。通過在后臺與服務器進行少量的數據交換,AJAX可以使網頁實現異步更新。即在不重載整個網頁面的情況下,對網頁的某部分進行更新。

AJAX 的好處

AJAX 可以實現異步通信效果,實現頁面局部刷新,帶來更好的用戶體驗:按需獲取數據,節約寬帶資源。

AJAX 的缺點

  1. AJAX 不支持瀏覽器的 back 按鈕。
  2. 安全問題。AJAX 暴露了與服務器交互的細節。
  3. 對搜索引擎的支持比較弱。
  4. 破壞了程序的異常機制

異步

指某段程序執行時不會阻塞其它程序執行,其表現形式為程序的執行順序,不依賴程序本身的書寫順序,相反則為同步。其優勢在于不阻塞程序的執行,從而提升整體的執行效率。

實現異步加載的方式

  1. defer 只支持ie
<script type="text/javascript" defer="defer"></script>
  1. async html5的屬性
<script type="text/javascript" src="" async="async"></script>
  1. 動態創建script
function loadScript(url, callback){
  var script = document.createElement("script")
  script.type = "text/javascript";
  if (script.readyState){ //IE
    script.onreadystatechange = function(){
      if (script.readyState == "loaded" ||script.readyState == "complete"){
        script.onreadystatechange = null;
        callback();
      }
    };
  } else { //Others: Firefox, Safari, Chrome, and Opera
    script.onload = function(){
      callback();
    };
  }
  script.src = url;
  document.body.appendChild(script);
}
  1. 由于javascript的動態性,還有很多異步加載的方法:XHR Injection、XHR Eval、Script In Iframe、Script defer屬性等等。
  • XHR Injection(XHR 注入):通過XMLHttpRequest來獲取javascript,然后創建一個script元素插入到DOM結構中。ajax請求成功后設置script.text為請求成功后返回的responseText。

另外:實現異步編程有哪些方式。(摘自Javascript異步編程的4種方法

  1. 回調函數 callback
function f1(callback){
  setTimeout(function () {
    //f1的任務代碼
    callback();
  },1000);
}

回調函數的優點是簡單,易理解和部署,缺點是不利于代碼閱讀和維護,各部分之間高度耦合,流程會很混亂,而且每個任務只能指定一個回調函數。

  1. 事件監聽
f1.on('done', f2);
function f1() {
  setTimeout(function () {
    //f1的任務代碼
    f1.trigger('done');
  }, 1000);
}

這種方法的優點是比較容易理解,可以綁定多個事件,每個事件可以指定多個回調函數,而且可以“去耦合”,有利于實現模塊化。缺點是整個程序都要變成事件驅動型,運行流程會變得很不清晰。

  1. 發布/訂閱
    采用的是Ben Alman 的 Tiny Pub/Sub
jQuery.subscribe("done", f2);
function f1() {
  setTimeout(function () {
    //f1的任務代碼
    jQuery.publish("done")
  }, 1000);
}

發布/訂閱模式(public-subscribe pattern),又稱觀察者模式(observer pattern)。
f1執行完成后向信號中心發布done信號,從而引發f2的執行。
f2執,行完成后可以取消訂閱。

jQuery.unsubscribe("done", f2);

這種方法的性質和“事件監聽”類似,但是明顯優于后者。因為我們可以通過查看“消息中心”。了解存在多少信號、每個信號有多少訂閱者,從而監控程序的運行。

  1. Promise對象
    ES6是由社區最早提出和實現,ES6將其寫進了語言標準,統一了用法,原生提供了Promise對象。
    從語法上說,Promise是一個對象,可以獲取異步操作的結果,它有三種狀態。
  • Pending(進行中)
  • Resolved(已完成,又稱Fulfilled)
  • Rejected(已失敗)
    只有異步操作的結果,可以決定當前是哪一種狀態。
    一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise對象的狀態改變,只有兩種可能:
  • 從 Pending 變為 Resolved。
  • 從 Pending 變為 Rejected。
var promise = new Promise(function(resolve, reject) {
  if (/* 異步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});
promise.then(function(value) {
  // success
}, function(error) {
  // failure
});

扯遠了...


同步異步的區別

  1. 同步:阻塞的
    瀏覽器向服務器請求數據,服務器比較忙,瀏覽器一直等著(頁面白屏),直到服務器返回數據,瀏覽器才能顯示頁面。
  2. 異步:非阻塞的
    瀏覽器向服務器請求數據,服務器比較忙,瀏覽器可以自如的干原來的事情(顯示頁面),服務器返回數據的時候通知瀏覽器一聲,瀏覽器把返回的數據再渲染到頁面,局部更新。

XMLhttpRequest

XMLhttpRequest可以以異步方式的處理程序。
瀏覽器內建對象,用于在后臺與服務器通信(交換數據),由此我們便可實現對網頁的部分更新,而不是刷新整個頁面。
一個基本的例子:

//實例化
var xhr = new XMLHttpRequest();
//發起一個http請求
xhr.open('get', 'index.php');
xhr.send(null);
//接收服務器響應
xhr.onreadystatechange = function () {
  if(xhr.readyState == 4 && xhr.status == 200) {
    var result = document.querySelector('.result');
    result.innerHTML = xhr.responseText
  }
}

請求

XMLHttpRequest 本質基于 HTTP 協議實現通信。HTTP 請求 3 個組成部分與 XMLHttpRequest 方法的對應關系:

  1. 請求行
xhr.open('get', 'index.php')
  1. 請求頭(get 請求可以不設置)
xhr.setRequestHeader('Content-Type', 'text/html');
  1. 請求主體
xhr.send(null);

響應

HTTP響應 3 個組成部分與 XMLHttpRequest 方法或屬性的對應關系。
由于服務器做出響應需要時間(比如網速慢等原因),所以我們需要監聽服務器響應的狀態,然后才能進行處理。

xhr.onreadystatechange = function () {
  if(xhr.readyState == 4 && xhr.status == 200) {
    var result = document.querySelector('.result');
    result.innerHTML = xhr.responseText;
  }
}

onreadystatechange 是 Javascript 的事件的一種,其意義在于監聽 XMLHttpRequest 的狀態。

  1. 獲取狀態行(包括狀態碼和狀態信息)
xhr.status
xhr.statusText
  1. 獲取響應頭
//獲取指定頭信息
xhr.getResponseHeader('Content-Type');
//獲取所有響應頭信息
hr.getAllResponseHeaders();
  1. 響應主體
xhr.responseText;
xhr.responseXML;

我們需要檢測并判斷響應頭的 MIME 類型后確定使用 request.responseText 或者 request.responseXML.

創建一個 ajax

var xhr = null;//創建對象
if (window.XMLHttpRequest) {
  xhr = new XHLHttpRequest();
}else {
  xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("方式", "地址", "標志位");//初始化請求
xhr.setRequestHeader("","")//設置相應頭信息
xhr.onreadystatechange = function () {}//指定回調函數
xhr.send();//發送請求

簡述ajax的過程

  1. 創建 XMLHttpRequest 對象,也就是創建一個異步調用對象。
  2. 創建一個新的 HTTP 請求,并指定該 HTTP 請求的方法、URL 及驗證信息。
  3. 設置響應 HTTP 請求狀態變化的函數。
  4. 發送 HTTP 請求
  5. 獲取異步調用返回的數據
  6. 使用 JavaScript 和 DOM 實現局部刷新

get 和 post 請求方式的差異

  • get 請求沒有請求主體,使用 xhr.send(null)。
  • get 可以通過在請求 URL 上添加請求參數。
  • post 可以通過 xhr.send('name=i&age=10')。
  • post 需要設置請求頭 xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  • get 效率更好(應用比較多)。
  • get 大小限制約 4K,post則沒有限制。

get 和 post 的區別,什么時候使用 post 請求

  • get:一般用于信息獲取,使用 URL 傳遞參數,對所發信息的數量也有限制,一般在 2000 個字符,有的瀏覽器是 8000 個字符。
  • 一般用于修改服務器上的資源,對所發送的信息沒有限制。
    以下情況中,使用post 請求:
    1. 無法使用緩存文件(更新服務器上的文件或數據庫)
    2. 向服務器發送大量數據(post 沒有數據量限制)
    3. 發送包含未知字符的用戶輸入時,post 比 get 更穩定也更可靠。

jquery 中的 ajax

  • $.ajax({}) 可配置方式發起 Ajax 請求。
  • $.get() 以 get 方式發起 Ajax 請求。
  • $.post() 以 post 方式發起ajax請求。
  • $('form').serialize() 序列化表單(即格式化 key=val&key=val)
  • url 接口地址
  • type 請求方式
  • timeout 請求超時
  • dataType 服務器返回格式
  • data 發送請求數據
  • beforeSend:function(){} 請求發起前調用
  • success 成功響應后調用
  • error 錯誤響應時調用
  • complete 響應完成時調用(包括成功和失敗)

jQuery 參考手冊 - Ajax

最后

忽然發現已經忘了 ajax 的一些理論基礎方面的知識了... 面試忽然問起,恩,懵住了... 所以學習嘛,還是要時常復習。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

推薦閱讀更多精彩內容