有關 ajax 的知識

Ajax的主要做用

Ajax的主要做用是向服務器請求數據的同時無需卸載頁面,也就是局部刷新,能夠帶來了更好的用戶體驗,同時ajax也有他的不足,好比破壞了瀏覽器的前進後退按鈕,對搜索引擎的支持不足,開發和調試工具缺少javascript

javascript中的Ajax

在javascript中,ajax是經過XMLHttpRequest對象來實現的,這個對象用於和後臺進行數據的交互。在ie7以前,XHR是經過MSXML庫中的ActiveX對象實現的,ie7後咱們能夠直接使用 var xhr = new XMLHttpRequest();建立一個XHR對象,建立好以後,咱們就能夠經過xhr對象來調用相應的方法了。php

javascript中Ajax的使用方法

在javascript中,調用Ajax主要分爲兩步,先open,再send
open指的是開啓一個請求,而send負責發送這個請求html

  1. open()方法java

    xhr.open('type','url',true);

    第一個參數是請求類型,get/post
    第二個參數是請求的地址 
    第三個參數表示請求是同步仍是異步,true表明異步處理
    注意的一點就是,open方法不會發送請求,只是啓動一個請求準備發送jquery

  2. send()方法ajax

    xhr.send(null);

    send方法將請求送給服務器 send方法接受一個參數做爲要發送的數據,若是不須要發送數據,參數設爲nullsql

  3. 檢測響應狀態碼
    通常請求發送以後,咱們能夠根據xhr的status屬性來判斷下一步的操做,status屬性會返回一個http狀態碼
    100-200表示請求已經接受,須要繼續處理
    200-300表示請求已被服務器成功接收
    300-400表示重定向,須要客戶端採起進一步操做
    400-500表示客戶端發生錯誤, 妨礙了服務器的處理
    500-600表示服務器處理請求的過程發生錯誤json

    `if((xhr.status>=200&&xhr.status<300)||xhr.status==304){ console.log(「request success」); }else{ console.log(「request failed」); } ` 
  4. 檢測 readyStatus屬性
    發送異步請求的時候,通常要檢測xhr的readyState屬性,這個屬性表示請求過程的當前活動階段,一共有5個值,0,1,2,3,4
    0表明爲初始化,open()未調用
    1表明啓動 已調用open,未調用send
    2表明 已經調用send, 但尚未接受到響應
    3表明 接受到部分響應數據
    4表明 接受到所有響應數據
    當readyState的值發生變化時,就會觸發一次readystatechange事件,用這個事件檢測每次狀態變化後的值。數組

var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if((xhr.status>=200&&xhr.status<300)||xhr.status==304){ console.log('request success'); }else{ console.log('request failed'); } } } xhr.open('get','test.php',true); xhr.send(null); 

get請求和post請求

get請求,經常使用於向服務器查詢某些信息,get可將查詢的字符串參數加在url的末尾瀏覽器

xhr.open('get','test.phpname1=value1&name2=value2',true); 

post請求,一般用於向服務器發送應該被保存的數據,post請求的主體能夠包含格式不限且大量的數據,

xhr.open('post','test.php',true); xhr.send('name1=value1&name2=value2'); 

get請求和post請求的區別

  1. get請求會將參數跟在url後進行傳遞,而post則是做爲http消息實體內容發送給服務器

  2. get方式對於傳輸的數據有大小限制,一般不能大於2kb,而post方式傳遞的數據量大小沒有限制

  3. get方式會將請求的數據會被緩存起來,能夠從瀏覽器的歷史記錄中讀取這些數據,因此會帶來一些安全性方面的問題,而post相對來講安全不少

jQuery中的Ajax

javascript的ajax操做比較複雜, jQuery提供了一系列的方法,大大簡潔了Ajax開發

1.load()方法

load(url,data,callback);

load方法主要是用來遠程載入HTML代碼並插入DOM 第一個參數是要訪問的HTML的url地址 第二個參數是要發送至服務器的key:value數據 第三個參數是回調函數,須要注意的是:load方法的回調函數不管請求成功或者失敗都會執行 load方法的傳遞方式是根據參數data來自動指定的 $('#submit').load('test.php',function(){}); // 無參數傳遞,get方式 $('#submit').load('test.php'{name:'fang',age:'30'},function(){}); // 有參數傳遞,post方式 

2.$.get()方法

$.get(url,data,callback,type)

前兩個參數和load方法是同樣的 可是回調函數只有在載入成功的時候纔會執行 第四個參數是服務器返回的內容格式,如xml,html,json,script,text $.get('test.php',{ name : 'fang', age : '33' },function(){ //回調函數 },type) 

3.$.post()方法

$.post(url,data,callback,type)

前兩個參數和load,$.get()方法是同樣的 可是回調函數只有在載入成功的時候纔會執行 第四個參數是服務器返回的內容格式,如xml,html,json,script,text $.post('test.php',{ name : 'fang', age : '33' },function(){ //回調函數 },type) 

4.$.ajax()方法

$.ajax()方法,這是方法不只但是實現上面的load,$.get(),$.post()方法,並且還能夠設定多種狀態下的回調函數
$.ajax(options)是jQuery的最底層Ajax實現,這個方法只有一個參數,可是這個參數內包含了所須要的一切信息,參數以key:value形式存在,全部參數都是可選的
$.ajax(url,type,timeout,data,datatype,beforeSend,complete,success,error,global)這些是全部的參數
url:發送請求的地址
type:請求方式,默認get
timeout:設置請求超時時間
data:發送到服務器的數據
datatype:預期服務器返回的數據類型
beforeSend:發送請求前能夠修改XMLHttpRequest對象的函數
complete:請求完成後調用的回調函數
success:請求成功後調用的回調函數
error:請求失敗後調用的回調函數
global:表示是否觸發全局Ajax事件,默認爲true

 



$.ajax({ url:'test.php', type:'GET', datatype:'json', beforeSend:function(){}, success:function(){}, error:function(){}, complete:function(){} })

JQuery 的AJAX方法使用很是的便利,而且提供了一些AJAX的全局方法供調用,合理使用這些方法將會產生很是大的幫助。

所謂全局方法,是指每當調用JQuery的AJAX方法,都會自動調用這些全局方法,如下是JQuery的全部全局方法:

 

 

[html]  view plain  copy
 
  1. ajaxStart:ajax請求開始前  
  2. ajaxSend:ajax請求時  
  3. ajaxSuccess:ajax獲取數據後  
  4. ajaxComplete:ajax請求完成時  
  5. ajaxError:ajax請求發生錯誤後  
  6. ajaxStop:ajax請求中止後  
  7. ajax請求中的6個全局事件

     
    複製代碼
    //事件觸發順序ajaxStart,ajaxSend,ajaxSuccess或ajaxError,ajaxComplete,ajaxStop
    
    $(document).ajaxStart(function (event) {
        /*
         * 每個ajax即將發送的時候觸發該事件,只有一個事件對象參數
         */
        console.log('ajaxStart');
    })
    
    $(document).ajaxSend(function (event,xhr,opts,err) {
        /*
         * 每個ajax即將發送的時候觸發該事件
         * 此方法接受四個參數,分別是事件對象,XHR對象,和發起ajax請求的配置對象,錯誤信息
         */
        if(opts.type == 'get'){
            xhr.abort();
        }    
    })
    
    $(document).ajaxSuccess(function (event,xhr,opts) {
        /*
         * 此方法接受三個參數,分別是事件對象,XHR對象,和發起ajax請求的配置對象
         * 每個ajax請求成功都會觸發該事件
         * 配置對象中的success回調會先執行,而後再執行這個事件
         */
        console.log(JSON.parse(xhr.responseText))
    })
    
    $(document).ajaxError(function (event,xhr,opts,err) {
        /*
         * 此方法接受四個參數,分別是事件對象,XHR對象,和發起ajax請求的配置對象,錯誤信息
         * 每個ajax請求失敗都會觸發該事件
         * 配置對象中的error回調會先執行,而後再執行這個事件
         * 若是是客戶端錯誤致使請求失敗,err的值有多是timeout,error,abort,或者是拋出錯誤異常對象
         */
        console.log(err)
    })
    
    $(document).ajaxComplete(function (event,xhr,opts) {
        /*
         * 此方法接受三個參數,分別是事件對象,XHR對象,和發起ajax請求的配置對象
         * 每個ajax請求完成都會觸發該事件,無論請求的結果如何
         * 配置對象中的complete回調會先執行,而後再執行這個事件
         */
    })
    
    $(document).ajaxStop(function (event) {
        /*
         * 此方法只接受一個事件對象參數,此事件只觸發一次
         * 當全部ajax請求完成的時候調用一次,無論ajax請求的狀態是失敗仍是成功或是被取消
         */
    })
    複製代碼

     注意:ajaxStart和ajaxSend事件必須放在ajax請求代碼以前,否則不會觸發

     

    jquery ajax中success與complete的執行順序

    http://blog.sina.com.cn/s/blog_4adc4b090101dhnh.html

    https://q.cnblogs.com/q/21810/

    ******************************************************************

     

    1. ajaxStart:ajax請求開始前  
    2. ajaxSend:ajax請求時  
    3. ajaxSuccess:ajax獲取數據後  
    4. ajaxComplete:ajax請求完成時  
    5. ajaxError:ajax請求發生錯誤後  
    6. ajaxStop:ajax請求中止後  

    jquery中各個事件執行順序以下:

    1.ajaxStart(全局事件)

    2.beforeSend

    3.ajaxSend(全局事件)

    附加的 ajaxEnd()事件

    4.success

    5.ajaxSuccess(全局事件)

    6.error

    7.ajaxError (全局事件)

    8.complete

    9.ajaxComplete(全局事件)

    10.ajaxStop(全局事件)

    先執行success,再執行error,最後始終執行complete

    ----------------------

     

    區別的就是 --- 

    success:當請求成功時調用函數,即status==200;

    complete:當請求完成時調用函數,即status==40四、40三、302...只要不出錯就行。

     

     

    由於一般咱們須要用來清理資源   因此就設計成compelete在success以後執行 

    jquery中的ajax方法參數老是記不住,這裏記錄一下。

     

    1.url
    要求爲String類型的參數,(默認爲當前頁地址)發送請求的地址。

    2.type
    要求爲String類型的參數,請求方式(post或get)默認爲get。注意其餘http請求方法,例如put和delete也可使用,但僅部分瀏覽器支持。

    3.timeout
    要求爲Number類型的參數,設置請求超時時間(毫秒)。此設置將覆蓋$.ajaxSetup()方法的全局設置。

    4.async
    要求爲Boolean類型的參數,默認設置爲true,全部請求均爲異步請求。若是須要發送同步請求,請將此選項設置爲false。注意,同步請求將鎖住瀏覽器,用戶其餘操做必須等待請求完成才能夠執行。(一般都是異步的請求,須要在請求完成後執行的操做通常放在回調函數裏邊)

    5.cache
    要求爲Boolean類型的參數,默認爲true(當dataType爲script時,默認爲false),設置爲false將不會從瀏覽器緩存中加載請求信息。

    6.data
    要求爲Object或String類型的參數,發送到服務器的數據。若是已經不是字符串,將自動轉換爲字符串格式。get請求中將附加在url後。防止這種自動轉換,能夠查看  processData選項。對象必須爲key/value格式,例如{foo1:"bar1",foo2:"bar2"}轉換爲&foo1=bar1&foo2=bar2。若是是數組,JQuery將自動爲不一樣值對應同一個名稱。例如{foo:["bar1","bar2"]}轉換爲&foo=bar1&foo=bar2。

    7.dataType
    要求爲String類型的參數,預期服務器返回的數據類型。若是不指定,JQuery將自動根據http包mime信息返回responseXML或responseText,並做爲回調函數參數傳遞。可用的類型以下:
    xml:返回XML文檔,可用JQuery處理。
    html:返回純文本HTML信息;包含的script標籤會在插入DOM時執行。
    script:返回純文本JavaScript代碼。不會自動緩存結果。除非設置了cache參數。注意在遠程請求時(不在同一個域下),全部post請求都將轉爲get請求。
    json:返回JSON數據。
    jsonp:JSONP格式。使用SONP形式調用函數時,例如myurl?callback=?,JQuery將自動替換後一個「?」爲正確的函數名,以執行回調函數。
    text:返回純文本字符串。

    8.beforeSend
    要求爲Function類型的參數,發送請求前能夠修改XMLHttpRequest對象的函數,例如添加自定義HTTP頭。在beforeSend中若是返回false能夠取消本次ajax請求。XMLHttpRequest對象是唯一的參數。
                function(XMLHttpRequest){
                   this;   //調用本次ajax請求時傳遞的options參數
                }
    9.complete
    要求爲Function類型的參數,請求完成後調用的回調函數(請求成功或失敗時均調用)。參數:XMLHttpRequest對象和一個描述成功請求類型的字符串。
              function(XMLHttpRequest, textStatus){
                 this;    //調用本次ajax請求時傳遞的options參數
              }

    10.success:要求爲Function類型的參數,請求成功後調用的回調函數,有兩個參數。
             (1)由服務器返回,並根據dataType參數進行處理後的數據。
             (2)描述狀態的字符串。
             function(data, textStatus){
                //data多是xmlDoc、jsonObj、html、text等等
                this;  //調用本次ajax請求時傳遞的options參數
             }

    11.error:
    要求爲Function類型的參數,請求失敗時被調用的函數。該函數有3個參數,即XMLHttpRequest對象、錯誤信息、捕獲的錯誤對象(可選)。ajax事件函數以下:
           function(XMLHttpRequest, textStatus, errorThrown){
              //一般狀況下textStatus和errorThrown只有其中一個包含信息
              this;   //調用本次ajax請求時傳遞的options參數
           }

    12.contentType
    要求爲String類型的參數,當發送信息至服務器時,內容編碼類型默認爲"application/x-www-form-urlencoded"。該默認值適合大多數應用場合。

    13.dataFilter
    要求爲Function類型的參數,給Ajax返回的原始數據進行預處理的函數。提供data和type兩個參數。data是Ajax返回的原始數據,type是調用jQuery.ajax時提供的dataType參數。函數返回的值將由jQuery進一步處理。
                function(data, type){
                    //返回處理後的數據
                    return data;
                }

    14.dataFilter
    要求爲Function類型的參數,給Ajax返回的原始數據進行預處理的函數。提供data和type兩個參數。data是Ajax返回的原始數據,type是調用jQuery.ajax時提供的dataType參數。函數返回的值將由jQuery進一步處理。
                function(data, type){
                    //返回處理後的數據
                    return data;
                }

    15.global
    要求爲Boolean類型的參數,默認爲true。表示是否觸發全局ajax事件。設置爲false將不會觸發全局ajax事件,ajaxStart或ajaxStop可用於控制各類ajax事件。

    16.ifModified
    要求爲Boolean類型的參數,默認爲false。僅在服務器數據改變時獲取新數據。服務器數據改變判斷的依據是Last-Modified頭信息。默認值是false,即忽略頭信息。

    17.jsonp
    要求爲String類型的參數,在一個jsonp請求中重寫回調函數的名字。該值用來替代在"callback=?"這種GET或POST請求中URL參數裏的"callback"部分,例如{jsonp:'onJsonPLoad'}會致使將"onJsonPLoad=?"傳給服務器。

    18.username
    要求爲String類型的參數,用於響應HTTP訪問認證請求的用戶名。

    19.password
    要求爲String類型的參數,用於響應HTTP訪問認證請求的密碼。

    20.processData
    要求爲Boolean類型的參數,默認爲true。默認狀況下,發送的數據將被轉換爲對象(從技術角度來說並不是字符串)以配合默認內容類型"application/x-www-form-urlencoded"。若是要發送DOM樹信息或者其餘不但願轉換的信息,請設置爲false。

    21.scriptCharset
    要求爲String類型的參數,只有當請求時dataType爲"jsonp"或者"script",而且type是GET時纔會用於強制修改字符集(charset)。一般在本地和遠程的內容編碼不一樣時使用。

    案例代碼:

    複製代碼
    複製代碼
    $(function(){
        $('#send').click(function(){
             $.ajax({
                 type: "GET",
                 url: "test.json",
                 data: {username:$("#username").val(), content:$("#content").val()},
                 dataType: "json",
                 success: function(data){
                             $('#resText').empty();   //清空resText裏面的全部內容
                             var html = ''; 
                             $.each(data, function(commentIndex, comment){
                                   html += '<div class="comment"><h6>' + comment['username']
                                             + ':</h6><p class="para"' + comment['content']
                                             + '</p></div>';
                             });
                             $('#resText').html(html);
                          }
             });
        });
    });
    複製代碼
    複製代碼

     

    22.順便說一下$.each()函數:
    $.each()函數不一樣於JQuery對象的each()方法,它是一個全局函數,不操做JQuery對象,而是以一個數組或者對象做爲第1個參數,以一個回調函數做爲第2個參數。回調函數擁有兩個參數:第1個爲對象的成員或數組的索引,第2個爲對應變量或內容。

     

    jQuery.ajaxSetup() 函數詳解

    能夠參考這篇:http://www.365mini.com/page/jquery_ajaxsetup.htm

    連接2:http://blog.csdn.net/david_520042/article/details/51952377

    不過要注意:若是用戶在本身的ajax定義了和全局ajaxSetup同樣的屬性,則用戶定義的屬性會覆蓋全局默認的屬性。如用戶本身定義了屬性error,ajaxSetup也定義了error,出現error時,會走用戶自定義的error,不會走ajaxSetup的error。

    若是你想寫一遍ajaxSetup,讓其餘頁面都支持這個功能,能夠這樣作:

    寫一個js,讓替他頁面引入這個js就好了。如寫ajaxSetup.js,ajaxSetup.js裏內容

     

    [html]  view plain  copy
     
    1. $(function(){  
    2.     $.ajaxSetup( {  
    3.         url: "/index.html" , // 默認URL  
    4.         aysnc: false , // 默認同步加載  
    5.         type: "POST" , // 默認使用POST方式  
    6.         headers: { // 默認添加請求頭  
    7.             "Author": "CodePlayer" ,  
    8.             "Powered-By": "CodePlayer"  
    9.         } ,  
    10.         error: function(jqXHR, textStatus, errorMsg){ // 出錯時默認的處理函數  
    11.             // jqXHR 是通過jQuery封裝的XMLHttpRequest對象  
    12.             // textStatus 可能爲: null、"timeout"、"error"、"abort"或"parsererror"  
    13.             // errorMsg 可能爲: "Not Found"、"Internal Server Error"等  
    14.   
    15.             // 提示形如:發送AJAX請求到"/index.html"時出錯[404]:Not Found  
    16.              
    17.             if (jqXHR.status==500) {  
    18.                  alert( '出錯[' + jqXHR.status + ']:' + errorMsg+':::'+jqXHR.responseText );    
    19.             }  
    20.             if (jqXHR.status==404) {  
    21.                 alert( '出錯[' + jqXHR.status + ']:' + errorMsg+':::'+jqXHR.responseText );    
    22.             }  
    23.               
    24.         }  
    25.     } );  
    26. });  
    而後別的頁面引入這個js就好了。

    jQuery.ajaxSetup()函數用於設置AJAX的全局默認設置。

    該函數用於更改jQuery中AJAX請求的默認設置選項。以後執行的全部AJAX請求,若是對應的選項參數沒有設置,將使用更改後的默認設置。

    該函數屬於全局jQuery對象。

    語法

    jQuery 1.1 新增該靜態函數。

     

    [html]  view plain  copy
     
    1. jQuery.ajaxSetup( settings )  

    參數

    參數 描述
    settings Object類型一個對象,其中的每一個屬性表示須要更改默認設置的選項,屬性值表示更改後的默認值。

    關於settings參數能夠識別的屬性,請參考jQuery.ajax()中的settings參數說明。其中的全部選項參數都是可選設置的。

    返回值

    jQuery.ajaxSetup()函數沒有返回值,或者說其返回值爲undefined

    源碼中其實最主要的是經過設置這個:$.ajaxSettings.cache=false;

    示例&說明

    如下是與jQuery.ajaxSetup()函數相關的jQuery示例代碼,以演示jQuery.ajaxSetup()函數的具體用法:

     

    [html]  view plain  copy
     
    1. //設置AJAX的全局默認選項  
    2. $.ajaxSetup( {  
    3.     url: "/index.html" , // 默認URL  
    4.     aysnc: false , // 默認同步加載  
    5.     type: "POST" , // 默認使用POST方式  
    6.     headers: { // 默認添加請求頭  
    7.         "Author": "CodePlayer" ,  
    8.         "Powered-By": "CodePlayer"  
    9.     } ,  
    10.     error: function(jqXHR, textStatus, errorMsg){ // 出錯時默認的處理函數  
    11.         // jqXHR 是通過jQuery封裝的XMLHttpRequest對象  
    12.         // textStatus 可能爲: null、"timeout"、"error"、"abort"或"parsererror"  
    13.         // errorMsg 可能爲: "Not Found"、"Internal Server Error"等  
    14.   
    15.         // 提示形如:發送AJAX請求到"/index.html"時出錯[404]:Not Found  
    16.         alert( '發送AJAX請求到"' + this.url + '"時出錯[' + jqXHR.status + ']:' + errorMsg );          
    17.     }  
    18. } );  
    19.   
    20.   
    21. // 未設置任何參數,但url、async、type、headers、error等參數的默認值均已被$.ajaxSetup()更改(如上)  
    22. $.ajax( );  
    23.   
    24.   
    25. // 設置了url、type、success、error,就使用本身設置的參數值  
    26. // 但async、headers等參數的默認值已被$.ajaxSetup()更改  
    27. $.ajax( {  
    28.     url: "myurl.php?action=list" ,  
    29.     type: "GET" ,  
    30.     success: function( data, textStatus, jqXHR ){  
    31.         alert("返回數據:" + data);  
    32.     } ,  
    33.     error: function(jqXHR, textStatus, errorMsg){  
    34.         alert("本身的error!");          
    35.     }  
    36. });  
    37.   
    38. // 上述$.ajaxSetup()的默認設置對$.get()、$.post()、load()、$.getJSON()、$.getScript()等AJAX函數也生效  
    39. // 由於這些函數也是在內部調用$.ajax()函數來實現的,只不過它們在內部都設置了一些參數  
    40.   
    41.   
    42. // $.get()在內部調用$.ajax()時已設置type爲"GET",所以仍然使用GET方式。  
    43. // 但url、async、headers、error等參數的默認值已被$.ajaxSetup()更改  
    44. $.get( );  
    45.   
    46.   
    47. // $.post()在內部調用$.ajax()時已設置type爲"POST",所以仍然使用POST方式。  
    48. // url也被設置爲"user/action.php?method=addUser"  
    49. // 但async、headers、error等參數的默認值已被$.ajaxSetup()更改  
    50. $.post( "user/action.php?method=addUser" );  
相關文章
相關標籤/搜索