jquery ajax詳解

happyAliceYu發表於2017-03-23

一:首先要明白前後臺資料互動的幾種方式:

1:最簡單的標籤

<a href="xxx.xxx?username='liufukin'">請求伺服器</a>
  • 1
  • 1

2:用的最多的表單

<form action="xxx.xxx" method="post/get">
    使用者名稱:<input type="text" name="username">
    密碼:<input type="password" name="userpwd">
    <input type="submit" value="提交">
</form>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

3:目前最流行的ajax非同步請求 
第一步:首先構造需要傳送給後臺的json格式資料

var sendData = {
    forgetType:flag,
    loginID:recevData.loginID,
    contactType:contactType,
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

第二步:使用jQuery的ajax、load、get、post、getJSON、getScript、getHTML等方法。

$.ajax({
    type:"post",
    url:"ResetLoginIDorPwd.action",
    data:sendData,
    success:function(data){
        if(isStrEmpty(data.error)){
        $("#sendResult").text(sendResult);
        gotoStep3();
        }else{
        $.alert(data.error);
        gotoLoginForm();
        }
    },
    error:function(){
        $.alert("<s:text name="err.system"/>");
        gotoLoginForm();
    }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

         注意:對於構造json格式物件的資料,有以下幾種方法

1var data1 = new Object();
    data1.username = "liufu";
    data1.userpwd = "abc";
    data1.age = 22;

2var data2 = {
        username:"liufu",
        userpwd:"abc"
    }
    data2.age = 22;
  注意:若放在ajax方法的第二個位置,則資料必須是*json格式的物件,而不能夠用JSON.stringify(data1)轉化為String後再放入
二:JQuery ajax詳解:
1)首先在html頁面要引入jquery外掛jquery-1.9.1.min.js的位置所在。2)jquery ajax的基本結構 $.ajax,這個是JQuery對ajax封裝的最基礎步,通過使用這個函式可以完成非同步通訊的所有功能。也就是說什麼情況下我們都可以通過此方法進行非同步重新整理的操作。但是它的引數較多,有的時候可能會麻煩一些。看一下常用的引數:      

 $.ajax( {

       type   //資料的提交方式:get和post

       url   //資料的提交路徑

       async   //是否支援非同步重新整理,預設是true

       data    //需要提交的資料

       dataType   //伺服器返回資料的型別,例如xml,String,Json等

       success    //請求成功後的回撥函式

       error   //請求失敗後的回撥函式

    });

$(function(){     });可以代替JS中的window.onload=function(){}

$.ajax(configObj);//通過$.ajax函式進行呼叫。

$.ajax的引數描述

引數 描述 url 必需。規定把請求傳送到哪個 URL。 data 可選,對映或字串值,規定連同請求傳送到伺服器的資料。

 success(data, textStatus, jqXHR) 可選。請求成功時執行的回撥函式。 

dataType 可選。規定預期的伺服器響應的資料型別。 預設執行智慧判斷(xml、json、script 或 html)。

$.ajax需要注意的一些地方:

1.data主要方式有三種html拼接的,json陣列,form表單經serialize()序列化的通過dataType指定,不指定智慧判斷。

後臺接收問題

1.如果是JSON格式的資料,後臺需要轉換為Map集合或者直接以屬性方式獲得:(以字串形式傳遞,且將JSON物件看做一個整體,

後臺只需以引數接收

var data= [{name:"jon",age:"12"},{name:"jic",age:"18"},{name:"petter",age:"14"}]

$.ajax({
               url:'./service/iposremoteapprove/caseToUser.do',
               data:{
                ds:JSON.stringify(data)   /* 特別需要注意這裡,需要現將json陣列通過JSON.stringify()處理一下之後,才能作為我們需要的引數傳過去
               },
               type:'post',
               success:function(json){
                $.messager.alert("提示","成功","info");
               }
  });

java接收引數

String ds = request.getParameter("ds");  
JSONArray json=JSONArray.fromObject(ds);
JSONObject jsonOne;
 Map<String,String> map=null;

for(int i=0;i<json.size();i++){
          updataMap = new HashMap<String,String>();
          jsonOne = json.getJSONObject(i); 
          map.put("name", (String) jsonOne.get("name"));
          map.put("age", (String) jsonOne.get("age"));
 }

此時map中就儲存了頁面傳過來的陣列中所有json中的鍵值對了

2.如果是表單型別:(將其序列化serialize()為字串引數拼接傳遞或者serializeArray()將其轉換為JSON格式資料,

然後使用data:{'User':JSON.stringify(formParam)},)以引數‘User’傳遞給後臺。

3.如果是字串型別(則後臺只能以單個引數的形式獲得所有一個個引數

4.$.ajax只提交form以文字方式,如果非同步提交包含<file>上傳是傳過不過去,需要使用jquery.form.js的$.ajaxSubmit

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)。通常在本地和遠端的內容編碼不同時使用。

3)使用jquery案例分析:
jquery ajax提交表單資料:
第一種:拼接字串的形式 即url?param=param1&param=param2:
$(function(){
$("#save").on("click", function (){ 
$.ajax({
url:'ajax1.action', 
data:$('#sub').serialize(), type:'post',success:function(data){alert(data);}
}); });});
<form id="sub"> <input type="text" name="test1"/><input type="text" name="test2"/><input type="text" name="test3"/><input type="text" name="test4"/><input type="button" id="save" value="save"/></form>
後臺接收:String par1 = req.getParameter("test1");形式接收
第二種:使用JSON格式資料:
$(function(){ 
         $("#save").on("click", function (){ 
          var params = $('#sub').serializeArray(); //序列化表格內容為物件陣列(表格中的資料需要起name="")
         $.ajax({ url:'ajax1.action', data:{'mydata':JSON.stringify(params)},dataType:'json',type:'post',success:function(data){alert(data);},
                         error:function(){ alert("表單提交失敗 ");}}); });}); 
後臺接收: 返回的資料格式為  
  1. mydata:
    [{"name":"startTime","value":"2013-02-01"},{"name":"endTime","value":"2017-07-19"}]
                       String jsonStr = req.getParameter("mydata");  
JSONArray jsonArray = JSONArray.fromObject(jsonStr);     //將得到的字串轉換為Json陣列
String name = "";String value="";
                       for(int i=0;i<jsonArray.size();i++){
                                        JSONObject  jsonObject = jsonArray.getJSONObject(i);
                                       name = jsonObject.getString("name");
                                      value = jsonObject.getString("value");
System.out.println(jsonObject);
}
第三種:構建JSON物件,後臺以物件形式接收
4)方法區別:
 

JSON.parse()和JSON.stringify()區別:

①parse用於從一個字串中解析出json物件,如

var str = '{"name":"huangxiaojian","age":"23"}'

結果:

JSON.parse(str)

Object
  1. age"23"
  2. name"huangxiaojian"
  3. __proto__Object
注意:單引號寫在{}外,每個屬性名都必須用雙引號,否則會丟擲異常。

②stringify()用於從一個物件解析出字串,如

var a = {a:1,b:2}

結果:

JSON.stringify(a)

"{"a":1,"b":2}"

2.serializeArray()與serialize()

serializeArray()序列化表單內容,返回JSON資料結構資料。

serialize()序列化表單元素為字串(即url請求時引數拼接的形式),用於 Ajax 請求。

eg:varfields = $("#表單id").serializeArray(); 返回物件陣列。

5)Ajax中解析JSON的兩種方法分析:

eval();  //此方法不推薦

JSON.parse();  //推薦方法

一、兩種方法的區別

我們先初始化一個json格式的物件:

  var jsonDate = '{ "name":"周星馳","age":23 }'

  var jsonObj = eval( '(' + jsonDate + ')' );  // eval();方法

  var jsonObj = JSON.parse( jsonDate );  // JSON.parse(); 方法

然後在控制檯呼叫:

  console.log( jsonObj.name );  // 兩種方法都可以正確輸入 周星馳

那麼問題來了 兩種方法有什麼區別呢?(下面我們稍微把程式碼改動一下,藍色字型為修改部分)

  var jsonDate = '{ "name":alert("hello"),"age":23 }'

  var jsonObj = eval( '(' + jsonDate + ')' );  // eval();方法

  console.log( jsonObj.age );  //會先執行“alert”輸出“hello”  然後才輸出 23

換“JSON.parse();”方法:

  var jsonDate = '{ "name":alert("hello"),"age":23 }'

  var jsonObj = JSON.parse( jsonDate );  // JSON.parse(); 方法

  cosole.log( jsonobj.age )  // 報錯  這個錯誤告訴我們這個字串是不合法的

小結:“eval();”方法解析的時候不會去判斷字串是否合法,而且json物件中的js方法也會被執行,這是非常危險的;

       而“JSON.parse();”方法的優點就不用多說了,推薦此方法。(不明白的盆友可以自己在控制檯測試一下)

二、擴充套件問題

  var jsonDate = '{ "name":"周星馳","age":23 }'

大家可以看到在上面測試時一直用紅色把包在花括號外面的引號標註了起來,這對引號是很關鍵卻又是常常被忽略的,因為 

eval();” 和 “JSON.parser();” 這兩個方法的引數只接受字串,也就是說只能解析字串!!

那我不經會有一個思考,我們在初始化的時候若不加引號對,那麼它本身就是物件,js可以直接獲取物件本身的屬性和方法;

為什麼還要加引號將它變成字串之後再用 “eval();” 或者 “JSON.parse();” 解析,這樣做不是既不環保又沒有效率嗎?

原因很簡單:前端提供給後臺的只能是字串資料格式後臺返回給前臺的就看返回的是什麼資料格式,是字串就必須

解析之後再用。



待解決問題:jquery九種選擇器,jquery ajax的幾個常用的事件方法。ajax提交檔案




            

相關文章