Ajax

兜兜轉轉一大圈,在它支持Markdown後又回來了。。

概念

學習ajax之前需要的知識儲備--json

Ajax

需要注意:

// 屬性名必須使用雙引號
// 不能使用十六進制值
// 不能使用undefined
// 不能使用函數和日期對象

必會方法:

JSON.parse('JSON')
  將json字符串轉爲JS對象
JSON.stringify(JS)
  將JS值轉換爲json字符串

注: BeJson 、SoJson在線工具可定位和檢查格式

ajax簡介

ajax(Asynchronous Javascript And XML),用JS語言與服務器進行異步交互。

  • 同步交互:客戶端發出請求後,需要等待服務器響應結束後,才能發下一個請求。
  • 異步交互:客戶端發出請求後,不用等待服務器響應結束,即可發下一個請求。

除了異步的特點外,還可實現:瀏覽器頁面局部刷新。

常見的應用場景

例如百度搜索時輸入字符後,會出現一個相關聯的下拉列表。當輸入框變化,瀏覽器用ajax技術相服務器發送請求,查看包含字符的前5項,然後把查詢結果相應給瀏覽器,瀏覽器渲染顯示。
和用戶註冊時輸入錯誤在移出輸入框會顯示錯誤信息。

  • 頁面不會刷新,只刷新局部位置。
  • 請求發出不影響頁面其他操作。

優點

優點:

  • 使用JS向服務器發送異步請求。
  • 無需刷新整個頁面
  • 因爲響應的只是頁面中局部內容,所以性能高。

示例:用jQuery實現

<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="{% static 'JS/jquery-3.1.1.js' %}"></script>
</head>
<body>
<button class="send_Ajax">send_Ajax</button>
<script>
      //$.ajax的兩種使用方式:

      //$.ajax(settings);
      //$.ajax(url,[settings]);

       $(".send_Ajax").click(function(){
           $.ajax({
               url:"/handle_Ajax/",
               type:"POST",
               data:{username:"abc",password:123},
               success:function(data){
                   alert(data)
               },

                 //=================== error============
                error: function (jqXHR, textStatus, err) {
                        // jqXHR: jQuery增強的xhr
                        // textStatus: 請求完成狀態
                        // err: 底層通過throw拋出的異常對象,值與錯誤類型有關
                        console.log(arguments);
                    },

                 //=================== complete============
                complete: function (jqXHR, textStatus) {
                    // jqXHR: jQuery增強的xhr
                    // textStatus: 請求完成狀態 success | error
                    console.log('statusCode: %d, statusText: %s', jqXHR.status, jqXHR.statusText);
                    console.log('textStatus: %s', textStatus);
                },

                //=================== statusCode============
                statusCode: {
                    '403': function (jqXHR, textStatus, err) {
                        console.log(arguments);  //注意:後端模擬errror方式:HttpResponse.status_code=500
                     },

                    '400': function () {
                    }
                }
           })
       })

</script>
</body>
</html>

view

import json,time
def index(request):
    return render(request,"index.html")
def handle_Ajax(request):
    username=request.POST.get("username")
    password=request.POST.get("password")
    print(username,password)
    time.sleep(10)
    return HttpResponse(json.dumps("Error Data!"))

$.ajax參數

請求參數

data---------################

  data: 當前ajax請求要攜帶的數據,是一個json的object對象,ajax方法就會默認地把它編碼成某種格式
  (urlencoded:?a=1&b=2)發送給服務端;此外,ajax默認以get方式發送請求。

           function testData() {
               $.ajax("/test",{     //此時的data是一個json形式的對象
                  data:{
                    a:1,
                    b:2
                  }
               });                   //?a=1&b=2

processData---------################

processData:聲明當前的data數據是否進行轉碼或預處理,默認爲true,即預處理;if爲false,
             那麼對data:{a:1,b:2}會調用json對象的toString()方法,即{a:1,b:2}.toString()
             ,最後得到一個[object,Object]形式的結果。

contentType---------################

contentType:默認值: "application/x-www-form-urlencoded"。發送信息至服務器時內容編碼類型。
             用來指明當前請求的數據編碼格式;urlencoded:?a=1&b=2;如果想以其他方式提交數據,
             比如contentType:"application/json",即向服務器發送一個json字符串:
               $.ajax("/ajax_get",{

                  data:JSON.stringify({
                       a:22,
                       b:33
                   }),
                   contentType:"application/json",
                   type:"POST",

               });                          //{a: 22, b: 33}

             注意:contentType:"application/json"一旦設定,data必須是json字符串,不能是json對象

             views.py:   json.loads(request.body.decode("utf8"))

traditional---------################

traditional:一般是我們的data數據有數組時會用到 :data:{a:22,b:33,c:["x","y"]},
              traditional爲false會對數據進行深層次迭代;  

響應參數

dataType:  預期服務器返回的數據類型,服務器端返回的數據會根據這個值解析後,傳遞給回調函數。
            默認不需要顯性指定這個屬性,ajax會根據服務器返回的content Type來進行轉換;
            比如我們的服務器響應的content Type爲json格式,這時ajax方法就會對響應的內容
            進行一個json格式的轉換,if轉換成功,我們在success的回調函數裏就會得到一個json格式
            的對象;轉換失敗就會觸發error這個回調函數。如果我們明確地指定目標類型,就可以使用
            data Type。
            dataType的可用值:html|xml|json|text|script
注: 在服務端設定好返回的數據類型  return HttpResponse(json.dumps(a),content_type="application/json")

javascript實現Ajax

Ajax核心

是在javascript中多添加個XMLHttpRequest對象。所有異步交互都是用它完成。
使用時用new生產該對象。

使用流程

1.打開與服務器的鏈接(open方法)
對象生產後,使用open方法連接服務器,參數如下:

open(method,url,async)
- method:請求方式,post或get
- URL:服務器的URI(資源地址),若get請求可追加參數。
- async:是否異步,默認爲TRUE

2.發送請求(send方法)
需要參數爲post請求的請求體內容,若無則給null。

3.接受響應
請求發出去後服務器執行,返回後接受方法如下:
onreadystatechange事件在該對象發生變化時被調用

XMLHttpRequest對象的五種狀態:

  • 0:初始化未完成,創建了對象爲調用open方法
  • 1:請求已開始。open方法調用,爲調用send方法
  • 2:請求發送完成。調用了send
  • 3:開始讀取服務端響應
  • 4:讀取結束。

爲防止在1234時都引發。要使用對象的readyState屬性拿到狀態值。
在建立請求後就定義該事件,設一個匿名方法判斷狀態值。

發送post請求注意事項

要使用setRequestheader設置content-type請求頭,因form表單默認不設定,不然會忽略請求體內容
設置好就能發請求體了。

小結

例:用戶名是否被註冊

填完光標移開後就像服務器發送異步請求,服務器返回布爾值,客戶端根據布爾值渲染用戶框

步驟:
1.在用戶名錶單字段中添加onblur事件,調用send方法。
2.send方法獲取字段內容,向服務器發送異步請求,參數爲用戶名
3.Django的view:獲取參數,判斷,符合則響應TRUE,否則FALSE

jQuery的serialize()

用於序列化表單元素並編碼爲utf-8,用於提交,提交有name和value值的。
不在form內的,沒name的,有disabled的都不提交。、
序列化後如下:
user=abc&password=123

使用時 $("form").serialize()

form表單上傳文件

設置input的type爲file
服務端接收時用request.FILES

Ajax的FormData對象實現Ajax上傳文件

用於異步上傳二進制文件。
new來初始化創建對象。
提取文件對象$("#id")[0].files[0]
使用append方法把文件對象添加到formdata對象中

用$.ajax({……,data:formdata,……}) 發送到服務端

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章