什么是Ajax?全面了解


一:Ajax

  • 引入Ajax:

我們知道,前端頁面想要和后端進行數據交互,可以通過以下方式

  • 將參數添加到url中,后端通過get方式從url中獲取數據 GET請求
  • 前端頁面通過form表單,將數據以get或者post的方式發送給后端 POST請求/GET請求
  • 前端通過a標簽(和使用url方式參數的方式) GET請求

此外,我們還可以使用ajax技術來實現前后端數據的交互。

  • Ajax GET請求/POST請求
1.什么是Ajax?
1.AJAX(Asynchronous Javascript And XML)翻譯成中文就是“異步的Javascript和XML”。即使用javascript語言與服務器進行異步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML)。
2.Ajax不是新的編程語言,而是一種使用現有標准的新方法。

什么是Ajax?工作原理?如何用Ajax完成GET請求-PHP問題-PHP中文網

2.Ajax最大的優點
1.Ajax最大的優點是在不重新加載整個頁面的情況下,可以與服務器交換數據並更新部分網頁內容。
(這一特點給用戶的感受是在不知不覺中完成請求和響應過程)
2.Ajax不需要任何瀏覽器插件,但需要用戶允許javaScript在瀏覽器上執行。
  • 同步交互: 客戶端發出一個請求后,需要等待服務器響應結束后,才能發出第二個請求。
  • 異步交互: 客戶端發出一個請求后,無需要等待服務器響應結束,就可以發出第二個請求。
Ajax用於"局部刷新頁面"和"異步提交"的特點

異步提交: 提交完認為不需要原地等待,立馬就做其他事
局部刷新: 不在局限於整個頁面的刷新,而是在於局部的某一個頁面的小塊刷新

因此和使用Form表單和后端進行數據交互的方式比較,具有以下優點:
  • Ajax使用JavaScript技術向服務器發送異步請求
  • Ajax請求無須刷新整個頁面
  • 因為服務器響應內容不再是整個頁面,而是頁面中的部分內容,所以Ajax性能高!
3.Ajax工作原理
1.Ajax相當於在用戶和服務器之間加了一個中間層(Ajax引擎),使用戶操作與服務器響應異步化。
2.並不是所有用戶請求都是提交給服務器,像一些數據驗證和數據處理等都交給Ajax引擎自己來做,只有確定需要從服務器讀取數據時再由Ajax引擎代為向服務器提交請求。
3.客戶端發送請求,請求交給Ajax,Ajax把請求提交給服務器,服務器進行業務處理,服務器響應數據交給Ajax對象,Ajax對象接收數據,由JavaScript把數據寫到頁面上。

img

要完整實現一個Ajax異步調用和局部刷新,同窗需要以下幾個步驟:

1.創建XMLHttpRequest對象,既創建一個異步調用對象
2.創建一個新的HTTP請求,並指定該HTTP請求的方法,URL及驗證信息
3.設置響應HTTP請求狀態變化的函數
4.發送HTTP請求
5.獲取異步調用返回數據
6.使用JavaSciript和DOM實現局部刷新

注意:
Ajax傳輸數據為XML(當然,傳輸數據不只是XML,現在更多使用json數據,基本上web頁面都是Ajax)
4.Ajax使用jQuery封裝
1.使用原生js寫Ajax請求(沒有人使用)
	1.原生的復雜並且在實際項目中也一般不用
	2.區分瀏覽器,需要做瀏覽器兼容
2.現在主流用法(jQuery已經封裝好了)
	1.jQuery內部封裝了DOM和BOM原生js
	2.jQuery更加簡便(宗旨: "Write less, do more")

jQuery介紹使用鏈接:https://www.cnblogs.com/goOJBK/p/15890701.html

5.Ajax基本語法
$.ajax({
	// 發送地址 1.不寫默認朝當前所在url提交數據 
	// 2.全寫 指名道姓 https://www.baidu.com 
	// 3.只寫后綴/login/
	url: '',  
	type: 'get/post',  	// 請求方式 默認get  
	data: {'username':'jason', 'password':123}  //   要發送的數據
	success:function(args){
		// 回調函數(異步回調機制)
	}
})


解析(重要):
    1.當你在利用ajax進行前后端交互的時候
    2.當后端給你返回結果的時候會自動觸發 args接受后端的返回結果

二:Ajax使用案例

1.案例需求
頁面上有三個input框:
    1.在前兩個框中輸入數字 點擊按鈕 朝后端發送ajax請求
    2.后端計算出結果 再返回給前端動態展示的到第三個input框中
    (整個過程頁面不准有刷新,也不能在前端計算)
2.index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--jQuery引入 CDN-->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<input type="text" id="d1"> +
<input type="text" id="d2"> =
<input type="text" id="d3">
<p>
    <button id="btn">點我</button>
</p>
<script>  // 記得導入jQuery  注釋掉settings第四行
    // 先給按鈕綁定一個點擊事件
    $('#btn').click(function () {
        // 朝后端發送ajax請求
        $.ajax({
            // 1.指定朝那個后端發送ajax請求
            url:'', // 不寫就是朝當前地址提交
            // 2.請求方式
            type:'post', // 不指定默認就是get  都是小寫
            // 3.數據
            data:{'i1':$('#d1').val(), 'i2':$('#d2').val()},  // 拿到#d1 與 #d2 內容
            // 4.回調函數=(異步回調機制)
            // 當后端給你返回結果的時候會自動觸發 args接受后端的返回結果
            success:function (args) {  // 目前無論后端返回什么,包括頁面,都是args接收
                {#alert(args)  #}
                // 通過DOM操作動態渲染到第三個input里面
                $('#d3').val(args)
            }
        })
    })
</script>
</body>
</html>
3.views.py
from django.shortcuts import render, HttpResponse

def ab_ajax(request):
    # 前端請求
    if request.method == "POST":
        # print(request.POST)  # <QueryDict: {'i1': ['111'], 'i2': ['222']}>
        # 拿到接收數據 進行加法運算 在返回回去
        i1 = request.POST.get('i1')
        i2 = request.POST.get('i2')
        # 先轉成整型再加
        i3 = int(i1) + int(i2)
        print(i3)
        # 返回給前端
        return HttpResponse(i3)
    return render(request, 'index.html')

image

三:驗證json后端返回前端字典

  • views.py
from django.shortcuts import render, HttpResponse

import json

def ab_ajax(request):
    # 前端請求
    if request.method == "POST":
        # 返回給字典
        d = {'code':100, 'msg':i3}
        return HttpResponse(json.dumps(d))  # 返回字典需要序列化
    return render(request, 'index.html')

image

四:驗證JsonResponse后端返回值

  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--jQuery引入 CDN-->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<input type="text" id="d1"> +
<input type="text" id="d2"> =
<input type="text" id="d3">
<p>
    <button id="btn">點我</button>
</p>
<script>  // 記得導入jQuery  注釋掉settings第四行
    // 先給按鈕綁定一個點擊事件
    $('#btn').click(function () {
        // 朝后端發送ajax請求
        $.ajax({
            // 1.指定朝那個后端發送ajax請求
            url:'', // 不寫就是朝當前地址提交
            // 2.請求方式
            type:'post', // 不指定默認就是get  都是小寫
            // 3.數據
            data:{'i1':$('#d1').val(), 'i2':$('#d2').val()},  // 拿到#d1 與 #d2 內容
            // 4.回調函數=(異步回調機制)
            // 當后端給你返回結果的時候會自動觸發 args接受后端的返回結果
            success:function (args) {  // 目前無論后端返回什么,包括頁面,都是args接收
                console.log(typeof args)   // 打印當前返回值類型
            }
        })
    })
</script>
</body>
</html>
  • views.py
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse

def ab_ajax(request):
    # 前端請求
    if request.method == "POST":
        # 返回給字典
        d = {'code':100, 'msg':666}
        return JsonResponse(d)
    return render(request, 'index.html')

image

五:總結兩種序列化方式

針對后端如果是用HttpResponse返回的數據 回調函數不會自動幫你反序列化
如果后端直接用的是JsonResponse返回數據 回調函數會自動幫你反序列化

HttpResponse不會自動反序列化解決方式
	1.自己在前端利用JSON。parse()
    2.在ajax里面配置一個參數
1.知識儲備
# 擴展 參數  代碼發布項目還會涉及
dataType:'JSON'

當后端是以HttpResponse返回的json格式的數據
默認是不會自動反序列化的
	1.自己手動JSON.parse()
	2.配置dataType參數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM