概述
Ajax用於瀏覽器與服務器通信而無需刷新整個頁面,服務器將不再返回整個頁面,而是返回少量數據,通過JavaScript DOM更新一部分節點。期間數據傳輸可采用xml,json等格式,Ajax最早用於谷歌的搜索提示。
其實不刷新整個頁面便可與服務器通信的方法有很多,比如Flash,Java applet,iframe等,但Ajax是目前最為常見的一種。
我們可以使用JavaScript擴展對象XMLHttpRequest實現Ajax,對於這種方法在這里不做介紹,下面直接了解jQuery實現Ajax的幾種方法。
數據格式
瀏覽器與服務器之間傳輸數據所采用的格式,比較常見的有xml,html,text,json,jsonp等,目前json由於占用更小存儲,且是JavaScript原生格式,因此很受歡迎。
當確定數據傳輸采用json格式后,下面就需要考慮序列化問題了。
網絡中傳輸的都是文本字符串(其實是二進制比特流,這里方便理解),因此在向網絡通道中寫入數據時,都需要先序列化json對象為文本字符串。而從網絡通道中讀取數據時,都需要反序列化文本字符串為json對象。在Python中json.dumps用於序列化,json.loads用於反序列化。
如果確定數據格式是json,JS也需對服務器返回的數據進行反序列化,即把json樣式的字符串變成json對象。
var json_str = '{"result": "hello, world!"}'; var json_object = eval("(" + json_str + ")"); // 法一,使用eval函數,注意括號 var json_object = jQuery.parseJSON(json_str); // 法二,使用jQuery的parseJSON函數 alert(json_object.result); // 反序列化成功,輸出結果
下面就引出jQuery中發送Ajax請求的幾個常見方法。
$.ajax()
該方法用於執行Ajax請求,常用於其他jQuery Ajax方法不能完成的請求,也許我們可以把它稱為"jQuery中Ajax系列方法之母"。
形式:$.ajax({name:val, name:val,...});
可選字段:
1)url:鏈接地址,字符串表示
2)data:需發送到服務器的數據,GET與POST都可以,格式為{A: '...', B: '...'}
3)type:"POST" 或 "GET",請求類型
4)timeout:請求超時時間,單位為毫秒,數值表示
5)cache:是否緩存請求結果,bool表示
6)contentType:內容類型,默認為"application/x-www-form-urlencoded"
7)dataType:服務器響應的數據類型,字符串表示;當填寫為json時,回調函數中無需再對數據反序列化為json
8)success:請求成功后,服務器回調的函數
9)error:請求失敗后,服務器回調的函數
10)complete:請求完成后調用的函數,無論請求是成功還是失敗,都會調用該函數;如果設置了success與error函數,則該函數在它們之后被調用
11)async:是否異步處理,bool表示,默認為true;設置該值為false后,JS不會向下執行,而是原地等待服務器返回數據,並完成相應的回調函數后,再向下執行
12)username:訪問認證請求中攜帶的用戶名,字符串表示
13)password:返回認證請求中攜帶的密碼,字符串表示
不知道將最后兩個放到data中去,是不是密碼會以明文展示,因沒有嘗試過,這里不敢下結論。
舉例:
$.ajax({ url: "/greet", data: {name: 'jenny'}, type: "POST", dataType: "json", success: function(data) { // data = jQuery.parseJSON(data); //dataType指明了返回數據為json類型,故不需要再反序列化 ... } });
$.post()
該方法使用POST方式執行Ajax請求,從服務器加載數據。
形式:$.post(url, data, func, dataType);
可選參數:
1)url:鏈接地址,字符串表示
2)data:需要發送到服務器的數據,格式為{A: '...', B: '...'}
3)func:請求成功后,服務器回調的函數;function(data, status, xhr),其中data為服務器回傳的數據,status為響應狀態,xhr為XMLHttpRequest對象,個人感覺關注data參數即可
4)dataType:服務器返回數據的格式
舉例:
$.post( "/greet", {name: 'Brad'}, function(data) { ... }, "json" );
$.get()
該方法使用GET方式執行Ajax請求,從服務器加載數據。
形式:$.get(url, data, func, dataType);
其各個參數所示意義與$.post()一致,在此不再列出,唯一區別就是請求類型是GET。
舉例:
$.get( "/greet", {name: 'Brad'}, function(data) { ... }, "json" );
上面三個是jQuery中發送Ajax請求較為重要的方法,下面再選擇三個較為常見的方法,簡單做解釋。
$.getJSON()
該方法使用GET方式執行Ajax請求,從服務器加載JSON格式數據。
形式:$.getJSON(url, data, func);
因為確定服務器返回json編碼的數據,故相較於$.get()不必再指定dataType。
舉例:
$.getJSON( "/greet", {name: 'jenny'}, function(data) { ... } );
$.load()
該方法將服務器加載的數據直接插入到指定DOM中。
形式:$.load(url, data, func);
其中data如果存在則使用POST方式發送請求,不存在則使用GET方式發送請求。
舉例:
<div id="ret"></div> $('#ret').load( "/greet", {name: 'Brad'} );
$.getScript()
該方法使用GET方式執行Ajax請求,從服務器加載並執行回傳的JavaScript。
形式:$.load(url, func);
<html> <body> <button οnclick="login1()">發送1</button> <button οnclick="login2()">發送2</button> <button οnclick="login3()">發送3</button> <button οnclick="login4()">發送4</button> <button οnclick="login5()">發送5</button> <div id="ret"></div> <script type="text/javascript" src="{{ url_for('static', filename='jquery.min.js') }}"></script> <script type="text/javascript"> function login1() { $.ajax({ url: "{{ url_for('greet') }}", data: {name: 'jenny'}, type: "POST", //dataType: "json", success: function(data) { // data = eval("(" + data+ ")"); data = jQuery.parseJSON(data); // dataType注釋了,故注意反序列化 $("#ret").text(data.result); } }); } function login2() { $.get( "{{ url_for('greet') }}", {name: 'Brad'}, function(data) { $("#ret").text(data.result); }, "json" ); } function login3() { $.getJSON( "{{ url_for('greet') }}", {name: 'jenny'}, function(data) { $("#ret").text(data.result); } ); } function login4() { $.post( "{{ url_for('greet') }}", {name: 'Brad'}, function(data) { $('#ret').text(data.result); }, "json" ); } function login5() { $('#ret').load( "{{ url_for('greet') }}", {name: 'Brad'} ); } </script> </body> </html>