11、AJAX
一、AJAX
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
- 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
- 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
1、AJAX常见应用场景
我们先用一个常见的场景来更加清晰的理解AJXA的作用,咱们平常都有注册过账号吧,在注册时给账户起名时,是否遇到过这种情况。名字被人注册了,弹出该用户名已存在的提示

这就是AJXA最常用的场景,整个过程页面并没有刷新,只是局部刷新了;在请求发出后,浏览器不用等待服务器响应结果就可以进行其他操作;
2、jQuery实现AJXA
做一个简单的数字相加的页面,用户在两个文本框输入不同的数字,点击计算按钮,在不刷新页面的情况下,计算出结果
首先把HTML页面做好
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% load static %}
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
</head>
<body>
<label>
<input type="text" id="d1"> +
<input type="text" id="d2"> =
<input type="text" id="d3">
</label>
<p><button id="btn">计算</button></p>
<script>
// 先给按钮绑定点击事件
$('#btn').click(function () {
// 朝后端发送AJAX请求
$.ajax({
// 1、指定朝哪个后端发送AJAX请求
url:'', // 不写就是朝当前地址提交
// 2、请求方式
type:'post',
// 3、数据(拿到第一个输入框内容和第二个输入框内容,然后朝后端发送)
data:{'i1':$('#d1').val(),'i2':$('#d2').val()},
// 4、回调函数(异步回调机制):后端返回结果时会自动触发,args即接受后端的返回结果
success:function (args){
$('#d3').val(args) // 通过DOM操作将内容 渲染到标签内容上
}
})
})
</script>
</body>
</html>
视图层views.py
# ajax
def ab_ajax(request):
if request.method == 'POST':
i1 = request.POST.get('i1') # 后端接收前端发送的内容
i2 = request.POST.get('i2')
i3 = int(i1) + int(i2) # 然后做相加的计算
return HttpResponse(i3)
return render(request, 'ab_ajax.html')
二、AJAX发送json格式数据
前后端在传输数据的时候,一定要表明你所发的的数据到底是什么格式。
前后端交互,必须确保数据是什么格式,编码就得是什么格式!
那么怎么告诉后端你要发送的数据的格式是什么呢
form 表单是通过 他的 enctype
而 ajax 是通过 contentType,如果你要传送的数据是json(通常只有json格式)
你需要这么写 contentType:'application/json'
要怎样发送一个json格式的数据呢? 后端有json.dumps 前端有JSON.stringify()。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<button class="btn btn-danger" id="d1">点我</button>
<script>
$('#d1').click(function(){
$.ajax({
url:'',
type:'post',
data:JSON.stringify({'username':'poco','age':22}), // 给的数据必须也是json格式
contentType:'application/json', // 指定编码格式为json
success:function () {
}
})
})
</script>
</body>
</html>
后端代码
import json
def ab_json(request):
if request.is_ajax(): # 判断是否是ajax请求
json_bytes = request.body
json_dict = json.loads(json_bytes)
print(json_dict, type(json_dict))
return render(request, 'ab_json.html')
三、AJAX发送文件数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<input type="text" name="username" id="t1">
<input type="text" name="password" id="t2">
<input type="file" name="myfile" id="t3">
<button id="b1">提交</button>
<script>
$('#b1').click(function () {
// 1.先生成一个formdata对象
var myFormData = new FormData();
// 2.朝对象中添加普通的键值
myFormData.append('username',$("#t1").val());
myFormData.append('password',$("#t2").val());
// 3.朝对象中添加文件数据
// 1.先通过jquery查找到该标签
// 2.将jquery对象转换成原生的js对象
// 3.利用原生js对象的方法 直接获取文件内容
myFormData.append('myfile',$('#t3')[0].files[0]);
$.ajax({
url:'',
type:'post',
data:myFormData, // 直接把对象放在data后面
// ajax发送文件必须指定的两个参数
contentType:false, // 不用任何编码 因为formdata对象自带编码 django能够识别该对象
processData:false, // 告诉浏览器不要对数据进行任何处理
success:function (data) {
alert(data)
}
})
})
</script>
</body>
</html>
后端
def ab_file(request):
if request.is_ajax(): # 判断是否是ajax请求
if request.method == 'POST':
print(request.POST)
print(request.FILES)
return render(request, 'ab_file.html')

浙公网安备 33010602011771号