1. 程式人生 > >Ajax總結一下

Ajax總結一下

一.什麼是Ajax

Ajax(Asynchronous JavaScript and XML),可以理解為JavaScript執行非同步網路請求。通俗的理解的話就是,如果沒有Ajax技術,改變網頁的一小部分(哪怕是一行文字、一張圖片)都需要重新載入一次整個頁面,而有了Ajax之後,就可以實現在網頁不跳轉不重新整理的情況下,在網頁後臺提交資料,部分更新頁面內容。


二.Ajax的原生寫法

1.XMLHttpRequest物件

XMLHttpRequest 物件用於在後臺與伺服器交換資料,能夠在不重新載入頁面的情況下更新網頁,在頁面已載入後從伺服器請求資料,在頁面已載入後從伺服器接收資料,在後臺向伺服器傳送資料。所以XMLHttpRequest物件是Ajax技術的核心所在。

2.實現流程

建立 XMLHttpRequest物件——>開啟請求地址,初始化資料——>傳送請求資料——>監聽回撥函式狀態——>收到伺服器返回的應答結果。

下面用具體的程式碼進行解釋:

全面總結Ajax

3.原生寫法中的注意點

(1).open() 的第三個引數中使用了 "true",該引數規定請求是否非同步處理,預設是非同步。True 表示指令碼會在 send() 方法之後繼續執行,而不等待來自伺服器的響應。

(2).關於readyState

(3).關於status 由伺服器返回的 HTTP 狀態程式碼,200 表示成功,而 404 表示 "Not Found" 錯誤。當 readyState 小於 3 的時候讀取這一屬性會導致一個異常。(後面會有http狀態碼的詳細解讀)


 

三.JQuery中的Ajax

JQuery對原生Ajax做了很好的封裝,使用起來非常簡單方便,具體的很多方法如 $.ajax,$.post, $.get, $.getJSON等能根據不同需要進行呼叫,寫法更加簡潔,但是為了兼顧各個方法在這裡我以一個通用的方法 $.ajax為例做一個簡單的解析,按照下面的模式寫好各個引數,就能成功進行Ajax的請求了,可能在實際中使用 $.post, $.get 這兩個方法使用比較多,但是理解$.ajax 這個通用的方法能對封裝原理有很好的認識。

全面總結Ajax

四.GET or POST?

作為Ajax最常用的兩種資料提交方式,GET和POST有著自己的特點和適用場景,正確區分GET和POST的不同並根據實際需要進行選用在開發中十分重要,簡單但是關鍵

1.傳遞資料的方式不同:get是直接把請求資料放在url的後面,是可見的,post的請求資料不會顯示在url中,是不可見的。

2.資料長度和資料型別的差異:get有資料長度的的限制,且資料型別只允許ASCII字元,post在這兩方面都沒有限制。

3.安全性的差異:get不安全,post更安全。

由此得出的兩者的使用場景

get使用較方便,適用於頁面之間非敏感資料的簡單傳值。

post使用較為安全,適用於向伺服器傳送密碼、token等敏感資料。


五.success和complete的區別

JQuery封裝的Ajax回撥函式中,success、error、complete是最常用的三個,其中,success和error很好區別,一個是請求成功呼叫的,另一個是請求失敗呼叫的,從字面上就可以理解。但是success和complete容易混淆,在這裡特別做一個說明:

success:請求成功後回撥函式。

complete:請求完成後回撥函式 (請求成功或失敗時均呼叫)。

注意到括號裡面了嗎,沒錯,區別就在於complete只要請求完成,不論是成功還是失敗均會呼叫。也就是說如果呼叫了success,一定會呼叫complete;反過來呼叫了complete,不一定會呼叫success。(狀態碼404、403、301、302...都會進入complete,只要不出錯就會呼叫)


六.XML -> JSON

Ajax中的是 "x" 指的就是XML。

xml:可擴充套件標記語言,標準通用標記語言的子集,是一種用於標記電子檔案使其具有結構性的標記語言。

xml作為一種資料互動格式,廣泛用在計算機領域,然而,隨著json的發展,json以其明顯的優勢已經漸漸取代了xml成為現在資料互動格式的標準,所以在這裡,想強調的是,json現在是主流的資料互動格式,前後端的互動標準,無論是前端提交給後臺的資料,還是後臺返回給前端的資料,都最好統一為json格式,各自接收到資料後再解析資料即可供後續使用。所以 "Ajax" 實際上已經發展為 "Ajaj"


七.JSON和JSONP

json 和 jsonp 看起來只相差了一個 “p” ,然而實際上根本不是一個東西,千萬別以為是差不多的兩個概念。

json:(JavaScript Object Notation, JS 物件標記) 是一種輕量級的資料交換格式。

jsonp:一種藉助 <script> 元素解決主流瀏覽器的跨域資料訪問問題的方式。


八.Ajax跨域訪問

ajax很好,但不是萬能的,ajax的請求與訪問同樣會受到瀏覽器同源策略的限制,不能訪問不同主域中的地址。所以,為了解決這一問題,實現跨域訪問,有很多種方式,上述提到的jsonp就是一種流行的方式,還有其他一些方式,我在這裡就不展開說了,只是想說明ajax的使用也是有條件的,任何技術的實現都不會是沒有限制的。


九.再議HTTP狀態碼

前面提到的"200"、"404"只是http狀態碼中常見的兩個,當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在伺服器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的伺服器會返回一個包含HTTP狀態碼的資訊頭(server header)用以響應瀏覽器的請求。

需要掌握的常見http狀態碼大致有以下一些:

全面總結Ajax

狀態碼


十.不可忽視的HTTP標頭檔案

http請求中的一個重要關注點就是請求頭和響應頭的內容,從這兩個標頭檔案中可以看出很多東西,當我們用傳送一個ajax請求的時候,如果沒有達到預期的效果,那麼就需要開啟瀏覽器的除錯工具,從NetWork中找到相應的ajax請求,再通過檢視請求頭和響應頭的資訊,大體會知道這次請求的結果是怎麼樣的,結合響應的主體內容,可以很快找到問題。所以學會看http的標頭檔案資訊是前端開發中必須掌握的一個技能,下面就來看看具體的標頭檔案資訊。

首先隨便上一張sf中的完成一個搜尋結果的http請求,可以從圖中的右側清楚看到請求頭和響應頭的內容,包括了很多個欄位資訊,這些欄位資訊就是我們需要掌握的知識點,下面挑出其中的重點欄位進行分析。

1.請求頭資訊:

全面總結Ajax

請求頭資訊

2.響應頭資訊:

全面總結Ajax

響應頭資訊

3.兩者都可能出現的訊息

Pragma:是否快取(http1.0提出) Cache-Control:是否快取(http1.1提出)

4.跟快取相關的欄位

(1) 強制快取 expire 和 cache-control

(2) 對比快取 Last-Modified 和 If-Modified-Since Etag 和 If-None-Match


十一.Ajax的優缺點

1.優點:

頁面無重新整理,在頁面內與伺服器通訊,減少使用者等待時間,增強了使用者體驗。

使用非同步方式與伺服器通訊,響應速度更快。

可以把一些原本伺服器的工作轉接到客戶端,利用客戶端閒置的能力來處理,減輕了伺服器和頻寬的負擔,節約空間和寬頻租用成本。

基於標準化的並被廣泛支援的技術,不需要下載外掛或者小程式。

2.缺點:

無法進行操作的後退,即不支援瀏覽器的頁面後退。

對搜尋引擎的支援比較弱。

可能會影響程式中的異常處理機制。

安全問題,對一些網站攻擊,如csrf、xxs、sql注入等不能很好地防禦。