什麼是ajax

1.背景介紹
什麼是AJAX?

即異步的 JavaScript 和 XML,是一種用於創建快速動態網頁的技術;

傳統的網頁(不使用 AJAX)如果需要更新內容,必需重載整個網頁面。

使用AJAX則不需要加載更新整個網頁,實現部分內容更新

2.知識剖析
AJAX

1、什麼是ajax

2、常見的ajax使用場景

3、爲什麼需要使用ajax

4、Ajax的工作原理

5、XMLHttpRequest常用方法及屬性

6、幾種常見的寫法

1、什麼是ajax

AJAX

AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。

AJAX 是與服務器交換數據並更新部分網頁的藝術,在不重新加載整個頁面的情況下。

2、常見的ajax使用場景

谷歌地圖,甚至一些彈幕,微博的時時更新評論等等

3、爲什麼需要使用ajax

ajax主要是實現頁面和web服務器之間數據的異步傳輸。

簡單來說,不採用ajax的頁面,當用戶在頁面發起請求時,就要進行整個頁面的刷新,刷新快慢取決於服務器的處理快慢。在這個過程中用戶必須得等待,不能進行其他操作。也就是同步的方式。客戶端和服務端傳遞了很多不需要的數據。效率低,用戶體驗差。

a、採用ajax的頁面,可以實現頁面的局部更新,而不是整個頁面的更新;b、並且發起請求後,用戶還可以進行頁面上的其他操作。這就是異步的方式。c、客戶端和服務端間只傳遞需要的數據,效率高,用戶體驗性好。d、並且Ajax引擎在客戶端運行,承擔了一部分本來由服務器承擔的工作,從而減少了大用戶量下的服務器負載。

4、Ajax的工作原理

圖片裏面提到一個xhr,所謂的“XHR”(瀏覽器內置對象”XMLHttpRequest”),也就是Ajax功能實現所依賴的對象,AJAX就是通過瀏覽器的內置對象XHMHttpResquest來發送異步請求的,異步請求不會妨礙客戶端的任何操作。

異步:

XHR相當於是一個通信兵,來負責客戶端與服務器之間的通信傳輸。舉個栗子:

要打仗了,前方陣地(客服端)不可能只等着通信兵(XHR)傳遞消息其他什麼也不幹吧,所以前方陣地還在幹着自己的事情然後派通信兵去請求後方指揮部(服務器)的命令,指揮部下達命令指揮,通信兵再把命令傳到前方陣地,然後前方陣地再執行命令相關的操作(客戶端把數據渲染到頁面),這也就是Ajax的異步原理。

再來說說同步:

所謂的同步就是前方陣地和通信兵一起去向服務器請求數據,直到通信兵請求到數據,我纔開始渲染頁面,在請求的過程中頁面一直是白屏等待的。

5、XMLHttpRequest常用方法

一、open();

XMLHttpRequest.open()方法用於指定 HTTP 請求的參數,或者說初始化 XMLHttpRequest 實例對象。它一共可以接受五個參數。

例:

xhr.open(‘POST’, ‘/carrots-admin-ajax/a/login’, true);

參數:

a, method:用於指定請求的類型  “GET"或者"POST”

b, url:用於請求的地址, 可相對可絕對

c, asyncFlag:指定請求方式爲同步還是異步, true爲異步, false爲同步

二、send();

XMLHttpRequest.send()方法用於實際發出 HTTP 請求。它的參數是可選的,如果不帶參數,就表示 HTTP 請求只包含頭信息,也就是隻有一個 URL,典型例子就是 GET

請求;如果帶有參數,就表示除了頭信息,還帶有包含具體數據的信息體,典型例子就是 POST 請求。

var xhr = new XMLHttpRequest();

var data = ‘name=’ + userVal + ‘&pwd=’ + pwVal;

xhr.open(‘POST’, ‘/carrots-admin-ajax/a/login’, true);

/* POST的請求頭 */

xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);

/* 發出HTTP請求 */

xhr.send(data);

注意,所有 XMLHttpRequest 的監聽事件,都必須在send()方法調用之前設定。(send放在最後)

6、XMLHttpRequest常用屬性

一, readyState

XMLHttpRequest.readyState返回一個整數,表示實例對象的當前狀態。該屬性只讀。它可能返回以下值。

0,表示 XMLHttpRequest 實例已經生成,但是實例的open()方法還沒有被調用。

1,表示open()方法已經調用,但是實例的send()方法還沒有調用,仍然可以使用實例的setRequestHeader()方法,設定 HTTP 請求的頭信息。

2,表示實例的send()方法已經調用,並且服務器返回的頭信息和狀態碼已經收到。

3,表示正在接收服務器傳來的數據體(body 部分)。

4,表示服務器返回的數據已經完全接收,或者本次接收已經失敗。

二, onreadystatechange

XMLHttpRequest.onreadystatechange屬性指向一個監聽函數。

通信過程中,每當實例對象發生狀態變化,它的readyState屬性的值就會改變。這個值每一次變化,都會觸發readyStateChange事件。

readystatechange事件發生時(實例的readyState屬性變化),就會執行這個屬性。

另外,如果使用實例的abort()方法,終止 XMLHttpRequest

請求,也會造成readyState屬性變化,導致調用XMLHttpRequest.onreadystatechange屬性。

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function(){

// 通信成功時,狀態值爲4

if (xhr.readyState === 4){

if (xhr.status === 200){

console.log(xhr.responseText);

} else {

console.error(xhr.statusText);

}

}};

xhr.open(‘GET’, ‘/endpoint’, true);

xhr.send(null);

三, responseText

XMLHttpRequest.responseText屬性返回從服務器接收到的字符串,該屬性爲只讀。只有 HTTP 請求完成接收以後,該屬性纔會包含完整的數據

四, status

XMLHttpRequest.status屬性返回一個整數,表示服務器迴應的 HTTP

狀態碼。一般來說,如果通信成功的話,這個狀態碼是200;如果服務器沒有返回狀態碼,那麼這個屬性默認是200。請求發出之前,該屬性爲0。該屬性只讀。

200, OK,訪問正常

404, Not Found,未發現指定網址

500, Internal Server Error,服務器發生錯誤

基本上,只有2xx和304的狀態碼,表示服務器返回是正常狀態。

7、常見幾種ajax方法

結合任務來看三種常見的寫法(不涉及框架中寫法)

a、原生寫法:見demo

b、jQuery 底層 AJAX 實現:見demo

c、jQuery 高層 AJAX 實現:見demo

3.常見問題
1、跨域問題

2、使用post提交的時候需要設置content-type爲"application/x-www-form-urlencoded"

4.解決方案
1、nginx配置跨域

2、使用post提交的時候需要設置content-type會出錯,見demo

5.編碼實戰

原生寫法/* 創建實例 */

//         var xhr = new XMLHttpRequest();

//         /* 需要發送的數據 */

//         var data = ‘name=’ + userVal + ‘&pwd=’ + pwVal;

//         console.log(data)

//         /* 指定請求的參數 */

//         xhr.open(‘POST’, ‘/carrots-admin-ajax/a/login’, true);

//         /* POST的請求頭 */

//         xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);

//         /* 發出HTTP請求 */

//         xhr.send(data);

/* $.ajax()寫法 */

// var xhr = $.ajax({

//     type: ‘POST’,

//     data: {

//         name: userVal,

//         pwd: pwVal

//     },

//     url: ‘/carrots-admin-ajax/a/login’,

//     success: function () {

//       }

// });

/* $.post()寫法 */

var data = {

name: userVal,

pwd: pwVal,

}

console.log(data)

var xhr = $.post(’/carrots-admin-ajax/a/login’, data, function () {})

6.擴展思考
AJAX的優缺點?

ajax的缺點:

ajax不支持瀏覽器back按鈕。

安全問題 AJAX暴露了與服務器交互的細節。

對搜索引擎的支持比較弱。

破壞了程序的異常機制。

不容易調試。

get與post的區別?

GET - 從指定的資源請求數據。

POST - 向指定的資源提交要被處理的數據

GET 請求可被緩存

GET 請求保留在瀏覽器歷史記錄中

GET 請求可被收藏爲書籤

GET 請求不應在處理敏感數據時使用

GET 請求有長度限制

GET 請求只應當用於取回數據

POST 請求不會被緩存

POST 請求不會保留在瀏覽器歷史記錄中

POST 不能被收藏爲書籤

POST 請求對數據長度沒有要求

作者:jnshu_it
來源:CSDN
原文:https://blog.csdn.net/jnshu_it/article/details/83858684
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章