ajax的工作原理
Ajax的原理簡單來說通過XmlHttpRequest對象來向服務器發(fā)異步請求,從服務器獲得數(shù)據(jù),然后用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從服務器獲得請求數(shù)據(jù)。要清楚這個過程和原理,我們必須對XMLHttpRequest有所了解。
XMLHttpRequest是ajax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是javascript可以及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。
jQuery框架中$.ajax()的常用參數(shù)
type
類型:String
默認值: "GET")。請求方式("POST"或"GET"),默認為"GET"。注意:其它HTTP請求方法,如PUT和DELETE也可以使用,但僅部分瀏覽器支持。
url
類型:String
默認值:當前頁地址。發(fā)送請求的地址。
success
類型:Function
請求成功后的回調(diào)函數(shù)。
參數(shù):由服務器返回,并根據(jù)dataType參數(shù)進行處理后的數(shù)據(jù);描述狀態(tài)的字符串。
這是一個Ajax事件。
async
類型:Boolean
默認值: true。默認設置下,所有請求均為異步請求。如果需要發(fā)送同步請求,請將此選項設置為false。
注意,同步請求將鎖住瀏覽器,用戶其它操作必須等待請求完成才可以執(zhí)行。
cache
類型:Boolean
默認值: true,dataType為script和jsonp時默認為false。設置為false將不緩存此頁面。
jQuery 1.2新功能。
data
類型:String
發(fā)送到服務器的數(shù)據(jù)。將自動轉換為請求字符串格式。GET請求中將附加在URL后。查看processData選項說明以禁止此自動轉換。必須為Key/Value格式。如果為數(shù)組,jQuery將自動為不同值對應同一個名稱。如{foo:["bar1",
"bar2"]}轉換為'&foo=bar1&foo=bar2'。
dataType
類型:String
預期服務器返回的數(shù)據(jù)類型。如果不指定,jQuery將自動根據(jù)HTTP包MIME信息來智能判斷,比如XML MIME類型就被識別為XML。在1.4中,JSON就會生成一個JavaScript對象,而script則會執(zhí)行這個腳本。隨后服務器端返回的數(shù)據(jù)會根據(jù)這個值解析后,傳遞給回調(diào)函數(shù)。可用值:
·"xml":返回XML文檔,可用jQuery處理。
·"html":返回純文本HTML信息;包含的script標簽會在插入dom時執(zhí)行。
·"script":返回純文本JavaScript代碼。不會自動緩存結果。除非設置了"cache"參數(shù)。注意:在遠程請求時(不在同一個域下),所有POST請求都將轉為GET請求。(因為將使用DOM的script標簽來加載)
·"json":返回JSON數(shù)據(jù)。
·"jsonp": JSONP格式。使用JSONP形式調(diào)用函數(shù)時,如"myurl?callback=?" jQuery將自動替換?為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。
·"text":返回純文本字符串
error
類型:Function
默認值:自動判斷(xml或html)。請求失敗時調(diào)用此函數(shù)。
有以下三個參數(shù):XMLHttpRequest對象、錯誤信息、(可選)捕獲的異常對象。
如果發(fā)生了錯誤,錯誤信息(第二個參數(shù))除了得到null之外,還可能是"timeout", "error",
"notmodified"和"parsererror"。
這是一個Ajax事件。
Ajax的最大的特點
Ajax可以實現(xiàn)異步通信效果,實現(xiàn)頁面局部刷新,帶來更好的用戶體驗;按需獲取數(shù)據(jù),節(jié)約帶寬資源
ajax的缺點
1、ajax不支持瀏覽器back按鈕。
2、安全問題AJAX暴露了與服務器交互的細節(jié)。
3、對搜索引擎的支持比較弱。
4、破壞了程序的異常機制
ajax請求的時候get和post方式的區(qū)別
get一般用來進行查詢操作,url地址有長度限制,請求的參數(shù)都暴露在url地址當中,如果傳遞中文參數(shù),需要自己進行編碼操作,安全性較低。
post請求方式主要用來提交數(shù)據(jù),沒有數(shù)據(jù)長度的限制,提交的數(shù)據(jù)內(nèi)容存在于http請求體中,數(shù)據(jù)不會暴漏在url地址中。
ajax的過程
1.創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調(diào)用對象
2.創(chuàng)建一個新的HTTP請求,并指定該HTTP請求的方法、URL及驗證信息
3.設置響應HTTP請求狀態(tài)變化的函數(shù)
4.發(fā)送HTTP請求
5.獲取異步調(diào)用返回的數(shù)據(jù)
6.使用JavaScript和DOM實現(xiàn)局部刷新
JavaScript的同源策略
同源策略是客戶端腳本(尤其是Javascript)的重要的安全度量標準。它最早出自Netscape Navigator2.0,其目的是防止某個文檔或腳本從多個不同源裝載。所謂同源指的是:協(xié)議,域名,端口相同,同源策略是一種安全協(xié)議,指一段腳本只能讀取來自同一來源的窗口和文檔的屬性。
解決跨域問題
理解跨域的概念:協(xié)議、域名、端口都相同才同域,否則都是跨域
出于安全考慮,服務器不允許ajax跨域獲取數(shù)據(jù),但是可以跨域獲取文件內(nèi)容,所以基于這一點,可以動態(tài)創(chuàng)建script標簽,使用標簽的src屬性訪問js文件的形式獲取js腳本,并且這個js腳本中的內(nèi)容是函數(shù)調(diào)用,該函數(shù)調(diào)用的參數(shù)是服務器返回的數(shù)據(jù),為了獲取這里的參數(shù)數(shù)據(jù),需要事先在頁面中定義回調(diào)函數(shù),在回調(diào)函數(shù)中處理服務器返回的數(shù)據(jù),