56.Ajax操作

【一】Ajax

1)简介

  • Ajax:异步的Javascript和XML,即JavaScript语言与服务器进行异步交互,传输的数据为XML

  • 可用与服务器交换数据并更新部分网页内容

  • 同步交互:

    • 客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求
  • 异步同步:

    • 客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求

2)精髓

  • 异步提交/局部刷新
    • 动态获取用户名,实时跟后台确认并将结果展示给前端

【二】Ajax使用

1)普通

# 引入js与boot使用Ajax
<script src="{% static 'js/jquery.min.js' %}"></script>
<link rel="stylesheet" href="{% static 'plugins/Bootstrap3/css/bootstrap.min.css' %}">
<script src="{% static 'plugins/Bootstrap3/js/bootstrap.min.js' %}"></script>
# 前端
<h1>Ajax实现前后端交互 —— 计算</h1>
<div>数字一 <input type="text" id="num_1"></div>
<div>数字二 <input type="text" id="num_2"></div>
<div>结果 <input type="text" id="result"></div>
<div>
    <button id="btn_add">点击计算</button>
</div>

<script>
    {#页面加载完毕时触发#}
    $(document).ready(
        {#绑定按键,点击触发#}
        $('#btn_add').click(function () {
            var num_one = $('#num_1').val()
            var num_two = $('#num_2').val()
            {#启用Ajax#}
            $.ajax({
                // 提交的目标地址
                url: "",
                // 请求方式(post,get)
                type: "post",
                // 请求体数据
                data: {'num_1': num_one, 'num_2': num_two},
                // 响应函数
                success: function (res) {
                    $('#result').val(res)
                }
            })
        })
    )
</script>
# 后端(直接返回字符串)
class Ajax_1(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'Ajax_1.html', locals())

    def post(self, request, *args, **kwargs):
        data = request.POST
        print('data:',data)
        # data: < QueryDict: {'num_1': ['1'], 'num_2': ['4']} >
        num_1 = request.POST.get('num_1')
        num_2 = request.POST.get('num_2')
        result = int(num_1) + int(num_2)
        print(result)
        # 3
        return HttpResponse(result)

2)升级

# 前端
<h1>Ajax实现前后端交互 —— 进阶:json模块</h1>
<div>数字一 <input type="text" id="num_1"></div>
<div>数字二 <input type="text" id="num_2"></div>
<div>结果 <input type="text" id="result"></div>
<div>
    <button id="btn_add">点击计算</button>
</div>

<script>
    $(document).ready(
        $('#btn_add').click(function () {
            let numberOne = $('#num_1').val()
            let numberTwo = $('#num_2').val()
            $.ajax({
                url: '',
                type: 'post',
                data: {'num_1': numberOne, 'num_2': numberTwo},
                success:function (res) {
                    console.log(res, typeof res)
                    alert(res.message)
                    $('#result').val(res.result)
                }
            })
        })
    )
</script>
#后端(返回字典)
class Ajax_2(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'Ajax_2.html', locals())

    def post(self, request, *args, **kwargs):
        data = request.POST
        print('data:', data)
        # data: < QueryDict: {'num_1': ['1'], 'num_2': ['2']} >
        num_1 = request.POST.get('num_1')
        num_2 = request.POST.get('num_2')
        result = int(num_1) + int(num_2)
        data = {'result': result, 'message': '计算成功'}
        print(data)
        # {'result': 3, 'message': '计算成功'}
        return JsonResponse(data)

3)进阶

1.form表单传递数据的格式

# json格式
<form action="" method="post" enctype="text/plain"></form>
# 只能传递键值数据,无法传递文件数据
<form action="" method="post" enctype="application/x-www-form-urlencoded"></form>
# 可传输键值对数据,文件数据作为单独的处理对象
<form action="" method="post" enctype="multipart/form-data"></form>

2.修改编码格式

$.ajax({
	...
	// 修改当前请求数据的编码格式
    contentType: "application/json",
	...
})

3.Ajax携带文件数据

# 前端
<h1>Ajax实现前后端交互 —— 进阶:携带文件数据</h1>
<div>text:<input type="text" id="text"></div>
<div>文件传输:<input type="file" id="file"></div>
<div>
    <button id="btn">提交数据</button>
</div>

<script>
    $(document).ready(
        $('#btn').click(function () {
            // 创建一个formData对象
            var formData = new FormData()
            // 获取键值对数据,并将数据添加到formDate对象中
            let text = $('#text').val()
            let file_obj = $('#file')[0].files[0]
            formData.append('text', text)
            formData.append('file_obj', file_obj)
            $.ajax({
                // 提交的目标地址
                url: "",
                // 请求方式
                type: "POST",
                //【3】请求体数据
                data: formData,
                // 【3.1】传递文件数据的时候
                // 需要修改当前请求数据的编码格式
                // 不需要使用任何的编码格式 原因是 formData 对象会自动帮我们编码
                contentType: false,
                // 修改当前是请求的限制类型
                // 告诉浏览器你不要对我的数据进行任何处理操作
                processData: false,
                // 响应函数
                success: function (res) {
                    alert(res.message)
                }
            })
        })
    )
</script>
# 后端
class Ajax_3(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'Ajax_3.html', locals())

    def post(self, request, *args, **kwargs):
        text = request.POST.get('text')
        file_obj = request.FILES.get('file_obj')
        print(file_obj, type(file_obj))
        # 0528db72-2b1a-4af7-87d8-9d0bb613a239.png
        # <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>

        # 文件的二进制
        img_obj = file_obj.read()
        data = {"code": 200, 'message': '上传成功'}
        return JsonResponse(data)

【三】request方法判断ajax

request.is_ajax()
  • 返回当前请求是否是ajax请求,返回布尔值
print(request.is_ajax())

# 正常浏览器网址回车提交的是 GET 请求 - 结果是False
# 当我们发送ajax请求后 - 结果是True

【三】二次弹窗插件

1)layer

# https://www.bootcdn.cn/
# https://www.bootcdn.cn/layer/
# https://layui.dev/2.7/layer/

2)layui

# https://layui.dev/docs/2/layer/

3)sweetalert

# https://www.bootcdn.cn/sweetalert/
# https://sweetalert.js.org/
posted on 2024-07-02 19:47  晓雾-Mist  阅读(3)  评论(0编辑  收藏  举报