摘要:實現流程創建對象打開請求地址,初始化數據發送請求數據監聽回調函數狀態收到服務器返回的應答結果。請求完成后回調函數請求成功或失敗時均調用。
Ajax在前端開發中有著舉足輕重的地位,關于Ajax的使用和注意事項一直是一個重要的話題,借此機會,本文希望對Ajax做一個全面的總結,徹底揭開Ajax的神秘面紗。
一.什么是AjaxAjax(Asynchronous JavaScript and XML),可以理解為JavaScript執行異步網絡請求。通俗的理解的話就是,如果沒有Ajax技術,改變網頁的一小部分(哪怕是一行文字、一張圖片)都需要重新加載一次整個頁面,而有了Ajax之后,就可以實現在網頁不跳轉不刷新的情況下,在網頁后臺提交數據,部分更新頁面內容。
二.Ajax的原生寫法 1.XMLHttpRequest對象XMLHttpRequest 對象用于在后臺與服務器交換數據,能夠在不重新加載頁面的情況下更新網頁,在頁面已加載后從服務器請求數據,在頁面已加載后從服務器接收數據,在后臺向服務器發送數據。所以XMLHttpRequest對象是Ajax技術的核心所在。
2.實現流程創建 XMLHttpRequest對象——>打開請求地址,初始化數據——>發送請求數據——>監聽回調函數狀態——>收到服務器返回的應答結果。
下面用具體的代碼進行解釋:
var xmlhttp; function loadXMLDoc(url) { xmlhttp=null; if (window.XMLHttpRequest) {// code for all new browsers xmlhttp=new XMLHttpRequest();//在這里創建 XMLHttpRequest對象 } else if (window.ActiveXObject) {// code for IE5 and IE6 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } if (xmlhttp!=null) { xmlhttp.open("GET",url,true); //請求的方式和請求地址 xmlhttp.send(null);//發送請求 xmlhttp.onreadystatechange=state_Change;//監聽回調函數 } else { alert("Your browser does not support XMLHTTP."); } } function state_Change() //這里是回調函數 { if (xmlhttp.readyState==4&&xmlhttp.status==200) //當滿足這兩個條件時表示請求成功,完成響應 4 = "loaded", 200 = OK { var data=xmlhttp.responseText; //拿到服務器返回的數據 // ...our code here...在這里進行數據返回后的操作 }else { alert("Problem retrieving XML data"); } }3.原生寫法中的注意點
(1).open() 的第三個參數中使用了 "true",該參數規定請求是否異步處理,默認是異步。True 表示腳本會在 send() 方法之后繼續執行,而不等待來自服務器的響應。
(2).關于readyState
(3).關于status
由服務器返回的 HTTP 狀態代碼,200 表示成功,而 404 表示 "Not Found" 錯誤。當 readyState 小于 3 的時候讀取這一屬性會導致一個異常。(后面會有http狀態碼的詳細解讀)
JQuery對原生Ajax做了很好的封裝,使用起來非常簡單方便,具體的很多方法如 $.ajax,$.post, $.get, $.getJSON等能根據不同需要進行調用,寫法更加簡潔,但是為了兼顧各個方法在這里我以一個通用的方法 $.ajax為例做一個簡單的解析,按照下面的模式寫好各個參數,就能成功進行Ajax的請求了,可能在實際中使用 $.post, $.get 這兩個方法使用比較多,但是**理****解$.ajax 這個通用的方法能對封裝原理有很好的認識。**
$.ajax({ type: //數據的提交方式:get和post url: //請求地址 async: //是否支持異步刷新,默認是true data: //需要提交的數據 dataType: //服務器返回數據的類型,例如xml,String,Json等 success:function(data){ } //請求成功后的回調函數,參數data就是服務器返回的數據 error:function(data){ } //請求失敗后的回調函數,根據需要可以不寫,一般只寫上面的success回調函數 })四.GET or POST?
作為Ajax最常用的兩種數據提交方式,GET和POST有著自己的特點和適用場景,正確區分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 -> JSONAjax中的是 "x" 指的就是XML。
xml:可擴展標記語言,標準通用標記語言的子集,是一種用于標記電子文件使其具有結構性的標記語言。
xml作為一種數據交互格式,廣泛用在計算機領域,然而,隨著json的發展,json以其明顯的優勢已經漸漸取代了xml成為現在數據交互格式的標準,所以在這里,想強調的是,json現在是主流的數據交互格式,前后端的交互標準,無論是前端提交給后臺的數據,還是后臺返回給前端的數據,都最好統一為json格式,各自接收到數據后再解析數據即可供后續使用。所以 "Ajax" 實際上已經發展為 "Ajaj"
json 和 jsonp 看起來只相差了一個 “p” ,然而實際上根本不是一個東西,千萬別以為是差不多的兩個概念。
json:(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式。
jsonp:一種借助“
Accept:客戶端支持的數據類型
Accept-Charset:客戶端采用的編碼
Accept-Encoding:客戶端支持的數據壓縮格式
Accept-Language:客戶端的語言環境
Cookie:客服端的cookie
Host:請求的服務器地址
Connection:客戶端與服務連接類型
If-Modified-Since:上一次請求資源的緩存時間,與Last-Modified對應
If-None-Match:客戶段緩存數據的唯一標識,與Etag對應
Referer:發起請求的源地址。
content-encoding:響應數據的壓縮格式。
content-length:響應數據的長度。
content-language:語言環境。
content-type:響應數據的類型。
Date:消息發送的時間
Age:經過的時間
Etag:被請求變量的實體值,用于判斷請求的資源是否發生變化
Expires:緩存的過期時間
Last-Modified:在服務器端最后被修改的時間
server:服務器的型號
Pragma:是否緩存(http1.0提出)
Cache-Control:是否緩存(http1.1提出)
(1) 強制緩存
expire 和 cache-control
(2) 對比緩存
Last-Modified 和 If-Modified-Since
Etag 和 If-None-Match
1.頁面無刷新,在頁面內與服務器通信,減少用戶等待時間,增強了用戶體驗。
2.使用異步方式與服務器通信,響應速度更快。
3.可以把一些原本服務器的工作轉接到客戶端,利用客戶端閑置的能力來處理,減輕了服務器和帶寬的負擔,節約空間和寬帶租用成本。
4.基于標準化的并被廣泛支持的技術,不需要下載插件或者小程序。
1.無法進行操作的后退,即不支持瀏覽器的頁面后退。
2.對搜索引擎的支持比較弱。
3.可能會影響程序中的異常處理機制。
4.安全問題,對一些網站攻擊,如csrf、xxs、sql注入等不能很好地防御。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84857.html
摘要:如果沒有學習過計算機科學的程序員,當我們在處理一些問題時,比較熟悉的數據結構就是數組,數組無疑是一個很好的選擇。 showImg(https://segmentfault.com/img/bVTSjt?w=400&h=300); 1、常見 CSS 布局方式詳見: 一些常見的 CSS 布局方式梳理,涉及 Flex 布局、Grid 布局、圣杯布局、雙飛翼布局等。http://cherryb...
摘要:如果沒有學習過計算機科學的程序員,當我們在處理一些問題時,比較熟悉的數據結構就是數組,數組無疑是一個很好的選擇。 showImg(https://segmentfault.com/img/bVTSjt?w=400&h=300); 1、常見 CSS 布局方式詳見: 一些常見的 CSS 布局方式梳理,涉及 Flex 布局、Grid 布局、圣杯布局、雙飛翼布局等。http://cherryb...
摘要:請求默認會攜帶同源請求的,而跨域請求則不會攜帶,設置的的屬性為將允許攜帶跨域。類型請求成功后的回調函數。另外,同樣提供了在環境下的支持,可謂是網絡請求的首選方案。當網絡故障時或請求被阻止時,才會標記為,如跨域不存在,網絡異常等會觸發。 一、前端進行網絡請求的關注點 大多數情況下,在前端發起一個網絡請求我們只需關注下面幾點: 傳入基本參數(url,請求方式) 請求參數、請求參數類型 設...
閱讀 2668·2021-11-24 10:44
閱讀 1930·2021-11-22 13:53
閱讀 1953·2021-09-30 09:47
閱讀 3714·2021-09-22 16:00
閱讀 2446·2021-09-08 09:36
閱讀 2323·2019-08-30 15:53
閱讀 2799·2019-08-30 15:48
閱讀 1000·2019-08-30 15:44