Ajax介绍及基础应用(三)

七.JQ对AJAX的支持

1.$obj.load()

  • 作用:载入远程的HTML文件到指定的元素中

  • 语法:

    $obj.load(url,data,callback)
    
    • $obj:用来显示响应内容的JQ元素(从远程载入的HTML文件所放入的元素)
    • url:请求的远程地址
    • data:请求到远程地址上的参数(可省略)
      • 方式1:字符串传参
        • “key1=value1&key2=value2”
        • 注:此种传参方式会使用GET方式发送请求
      • 方式2:使用JS对象传参
        • {
          key1:“value1”,
          key2:“value2”
          }
        • 注:此种传参方式会使用POST方式发送请求
    • callback:响应成功之后的回调函数(可省略)(响应成功后想干点什么,匿名函数)
  • 示例:

    # django_app_name/views.py
    
    def load_views(request):
        return render(request, '01-load.html')
    
    def server01(request):
        # 接受前端传递过来的参数 - 字符串传参
        # uname = request.GET['uname']
        # uage = request.GET['uage']
    
        # 接受前端传递过来的参数 - JS对象传参
        uname = request.POST['uname']
        uage = request.POST['uage']
        return render(request, '01-server.html', locals())
    
    <!-- templates/01-load.html -->
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>01-load</title>
        <script src="/static/js/jquery-1.11.3.js"></script>
        <script>
            $(function () {
                $("#btnLoad").click(function () {
                    // 1.通过字符串表示传参
                    // var params = 'uname=lvze&uage=30';
                    // $("#baidu").load("/ajax/01-server",params);
    
                    // 2.通过js对象表示参数
                    var params = {
                        uname:'maria',
                        uage:30,
                        csrfmiddlewaretoken:$("[name = 'csrfmiddlewaretoken']").val(),
                    };
                    $("#baidu").load("/ajax/01-server/",params,function () {
                        window.setTimeout(function () {
                            // 在3秒钟之内将#baidu元素隐藏
                            $("#baidu").hide(3000);
                        },5000)
                    })
                });
            })
        </script>
    </head>
    <body>
        {% csrf_token %}
        <button id="btnLoad">加载01-server</button>
        <div id="baidu"></div>
    </body>
    </html>
    
    <!-- templates/01-server.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>01-server</title>
    </head>
    <body>
        <h1>这是01-server.html的server</h1>
        <h2>姓名:{{ uname }}</h2>
        <h2>年龄:{{ uage }}</h2>
        <ul>
            <li>
                <a href="#">首页</a>
            </li>
            <li>
                <a href="#">购物车</a>
            </li>
            <li>
                <a href="#">个人信息</a>
            </li>
        </ul>
    </body>
    </html>
    

2.$.get()

  • 作用:通过GET方式异步的向远程地址发送请求(只支持异步,不支持同步)

  • 语法:$.get(url,data,callback,type)

    • url:请求地址
    • data:发送到服务器端的参数
    • callback:响应成功之后的回调函数
    • type:响应回来的数据的数据格式
      • 取值如下:
        1. html:响应回来的文本是html文本
        2. Text:响应回来的文本是text文本
        3. script:响应回来的文本是js执行脚本
        4. json:响应回来的文本是JSON格式文本(JSON格式文本会转换成JSON对象)
  • 综合示例

    # django_app_name/views.py
    def get_views(request):
        return render(request, '02-get.html')
    
    def server02(request):
        dic = {
            'uname': 'Uzumaki Naruto',
            'uage': 16,
        }
        jsonStr = json.dumps(dic)
        return HttpResponse(jsonStr)
    
    <!-- templates/02-get.html-->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>02-get</title>
        <script src="/static/js/jquery-1.11.3.js"></script>
        <script>
            $(function () {
                $("#btnGet").click(function () {
                    $.get('/ajax/02-server',function (data) {
                        // data表示响应回来的数据
                        console.log(data);
                        var msg = '姓名:'+data.uname;
                        msg += '年龄:'+data.uage;
                        $("#show").html(msg)
                    },'json')
                })
            })
        </script>
    </head>
    <body>
        <button id="btnGet">JQ-Ajax-Get</button>
        <div id="show"></div>
    </body>
    </html>
    

3.$.post()

  • 作用:通过POST方式异步的向远程地址发送请求(只支持异步,不支持同步)

  • 语法:与GET方式相同,但是有data参数,因为需要向服务器端发送参数

  • 综合示例

    # django_app_name/views.py
    def post_views(request):
        return render(request, '03-post.html')
    
    def server03(request):
        # 获取到前端发送过来的参数
        uname = request.POST['uname']
        uage = request.POST['uage']
        ugender = request.POST['ugender']
    
        # 将前端发送过来的数据转换为字符串格式
        # msg = "name:%s,age:%s,gender:%s" % (uname, uage, ugender)
    
        # 将前端发送过来的数据转换为字典
        msg = {
            'uname':uname,
            'uage':uage,
            'ugender':ugender
        }
        # 将字典转换为JSON字符串
        msg = json.dumps(msg)
        print(msg)
        return HttpResponse(msg)
    
    <!-- templates/03-post.html -->
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>03-post</title>
        <script src="/static/js/jquery-1.11.3.js"></script>
        <script>
            $(function () {
                $("#btnPost").click(function () {
                    $.post('/ajax/03-server/',{
                        uname:$("#uname").val(),
                        uage:$("#uage").val(),
                        ugender:$("#ugender").val(),
                        csrfmiddlewaretoken:$("[name = 'csrfmiddlewaretoken']").val()
                    },function (data) {
                        // alert("响应回来的内容:"+data);
                        console.log(data)
                    },'json');
                })
            })
        </script>
    </head>
    <body>
        {% csrf_token %}
        <p>
            姓名:<input type="text" id="uname">
        </p>
        <p>
            年龄:<input type="text" id="uage">
        </p>
        <p>性别:
            <select id="ugender">
                <option value="male"></option>
                <option value="female"></option>
            </select>
        </p>
        <button id="btnPost">提交</button>
        <div id="show"></div>
    </body>
    </html>
    

4.$.ajax()

  • 作用:允许自定义所有的ajax操作

  • 语法:$.ajax({ajax的参数对象});

    • ajax的参数对象
      1. url:异步请求地址(必填)
      2. data:请求到服务器端的参数(POST必填,GET选填)
        1. 字符串
        2. JS对象
      3. type:请求方式,GETPOST(必填)
      4. dataType:服务器端响应回来的数据的格式(必填)
        • html,Text,script,json
      5. async:是否采用异步的方式发送请求(异步选填,同步必填)
        • true:使用异步(默认值)
        • false:使用同步
      6. success:响应成功之后的回调函数
        • function(data){
          data表示的是响应回来的数据
          }
      7. error:请求或响应失败时的回调函数
  • 综合示例

# django_app_name/views.py

def ajax_views(request):
    return render(request, '04-ajax.html')

def server04(request):
    list = [
        {
            "cname": "python基础",
            "teacher": "wangwu"
        }, {
            "cname": "web基础",
            "teacher": "lisi"
        }
    ]
    return HttpResponse(json.dumps(list))
<!-- templates/04-ajax.html -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>04-ajax</title>
    <script src="/static/js/jquery-1.11.3.js"></script>
    <script>
        $(function () {
            $("#btnAjax").click(function () {
                $.ajax({
                    url:'/ajax/04-server',
                    type:'get',
                    dataType:'json',
                    async:true,
                    success:function (data) {
                        $(data).each(function (i, obj) {
                            console.log("课程名称:"+obj.cname);
                            console.log("授课老师:"+obj.teacher);
                        });
                    },
                    error:function () {
                        alert("操作有误,请联系管理员... ...")
                    }
                });
            });
        })
    </script>
</head>
<body>
    <button id="btnAjax">JQ-AJAX</button>
</body>
</html>

八.跨域(Cross Domain)

  1. 什么是跨域

    • HTTP协议中的一个策略 - ‘同源策略’

    • 同源:多个地址中,具备相同协议,相同域名,相同端口的地址称为"同源地址"

    • 在HTTP中,只有同源地址才能发送ajax请求,非同源地址是被拒绝的(<script>和<img>除外)

      http://www.tedu.cn/a.html
      http://www.tedt.cn/server
      以上地址是`同源地址`
      
      http://www.tedu.cn/a.html
      https://www.tedu.cn/server
      以上地址是`非同源地址`
      
      http://localhost:8000/a.html
      http://127.0.0.1:8000/server
      以上地址是`非同源地址`
      
  2. 实际项目中的跨域请求应用

    • 综合示例

      # django_app_name/views.py
      
      def js_views(request):
          return render(request,'06-js.html')
      
      def server06(request):
          # return HttpResponse("console.log('这是server06响应的内容')")
          # return HttpResponse("cross_callback('这是server06响应的内容')")
          # 1.接收前端传递过来的参数值
          cb = request.GET['callback']
          return HttpResponse(cb+"('这是server06cb响应的内容')")
      
      <!-- templates/06-js.html -->
      
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>06-js</title>
          <script src="/static/js/jquery-1.11.3.js"></script>
          <script>
              // function cross_callback(data) {
              //     alert(data);
              // }
      
              function abcd(data) {
                  alert(data);
              }
      
              // $(function () {
              //     $("#btnJS").click(function () {
              //         var script = document.createElement("script");
              //         script.src = "http://localhost:8000/ajax/06-server";
              //         $("body").append(script);
              //     })
              // });
      
              $(function () {
                  $("#btnJS").click(function () {
                      var script = document.createElement("script");
                      script.src = "http://localhost:8000/ajax/06-server?callback=abcd";
                      $("body").append(script);
                  })
              })
          </script>
      </head>
      <body>
      <!--    <script src="/static/js/my.js"></script>-->
      <!--    <script src="http://localhost:8000/ajax/06-server"></script>-->
      <button id="btnJS">跨域请求</button>
      </body>
      </html>
      
    • 在浏览器端输入http://127.0.0.1:8000/ajax/06-js,点击跨域请求,浏览器会向http://localhost:8000/ajax/06-server地址发送请求,注意:此请求为跨域请求,并传入callback参数(函数名),在后端服务器中,通过cb = request.GET['callback']获取到前端传入过来的函数名称,然后在响应浏览器请求的时候将函数名和数据一起返回,这样就保证了后端仅仅只是处理数据,前端接受,同时因为是在<script>标签中,所以可以跨域接收

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值